『壹』 在java中實現TCP協議編程中怎麼傳
在Java中實現TCP協議編程
ServerSocket:編寫TCP網路服務程序,首先要用到java.net.ServerSocket類用以創建伺服器Socket
構造方法:
ServerSocket(intport):創建綁定到特定埠的伺服器套接字
ServerSocket(intport,intbacklog):利用指定的backlog(伺服器忙時保持連接請求的等待客戶數量),創建伺服器套接字並將其綁定到指定的本地埠號。
ServerSocket(intport,intbacklog,InetAddressbindAddr):使用指定的埠、偵聽backlog和要綁定到的本地IP地址創建伺服器。
Socket:客戶端要與伺服器建立連接,必須先創建一個Socket對象
常用構造方法
Socket(Stringhost,intport):創建一個流套接字並將其連接到指定主機上的指定埠號。
Socket(InetAddressaddress,intport):創建一個流套接字並將其連接到指定IP地址的指定埠號。
伺服器端程序調用ServerSocket類中的accept()方法等待客戶端的連接請求,一旦accept()接收了客戶端連接請求,該方法返回一個與該客戶端建立了專線連接的Socket對象,不用程序去創建這個Socket對象。建立了連接的兩個Socket是以IO流的方式進行數據交換的,Java提供了Socket類中的getInputStream()返回Socket的輸入流對象,getOutputStream()返回Socket的輸出流對象。
TCP伺服器與TCP客戶端間的數據的接受圖示:
用TCP實現伺服器與客戶端的「聊天」:
實例代碼:
客戶端:
packagecom.hbsi.net;
importjava.net.Socket;
importjava.io.*;
publicclassTcpClient{
publicstaticvoidmain(String[]args)throwsException{
//1.建立tcp客戶端socket,要確定要連接的伺服器ip,port
Sockets=newSocket("192.168.49.87",9009);
//獲取鍵盤錄入
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
//2.通過建立的socket,獲取輸出流對象
//數據輸出給伺服器端
OutputStreamout=s.getOutputStream();
BufferedWriterbwout=newBufferedWriter(newOutputStreamWriter(out));
//獲取伺服器端返回的數據
//讀取伺服器端發過來的信息InputStreamReader()
BufferedReaderbrin=newBufferedReader(newInputStreamReader(
s.getInputStream()));
Stringline=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
Stringstr=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}
伺服器端:
packagecom.hbsi.net;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassTcpServer{
publicstaticvoidmain(String[]args)throwsException{
//1.建立伺服器socket
ServerSocketss=newServerSocket(9009);
//2.調用accept()
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+"...connection");
//讀取客戶的信息的輸入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=newBufferedReader(newInputStreamReader(in));
//向客戶端發送信息輸出流,服務端向客戶端返回信息OutputStreamWriter()
BufferedWriterbrout=newBufferedWriter(newOutputStreamWriter(
s.getOutputStream())); Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());//伺服器端收到信息後,將信息轉為大寫返回給客戶端toUpperCase()
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}
『貳』 求TCP/IP client server socket的JAVA代碼
我這剛好有一個,給你參考一下:(分客戶端和伺服器兩個小程序)
//客戶端程序及聊天室的圖形用戶界面
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
public class ChatTCPSocketJFrame extends JFrame implements ActionListener
{
private String name; //網名
private Socket socket; //TCP Socket對象
private JTextArea text_receiver; //顯示對話內容的文本區
private JTextField text_sender; //輸入發送內容的文本行
private JButton button_send,button_leave; //發送和離線按鈕
private PrintWriter cout; //字元輸出流對象
public ChatTCPSocketJFrame(String name, Socket socket) throws IOException//提供圖形用戶界面
{
super("聊天室 "+name+" "+InetAddress.getLocalHost()+" : "+socket.getLocalPort());
this.setBounds(320,240,400,240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.text_receiver = new JTextArea();
this.text_receiver.setEditable(false); //文本區不可編輯
this.getContentPane().add(new JScrollPane(this.text_receiver));
JPanel panel = new JPanel();
this.getContentPane().add(panel,"South");
this.text_sender = new JTextField(16);
panel.add(this.text_sender);
button_send = new JButton("發送");
panel.add(button_send);
button_send.addActionListener(this);
button_leave = new JButton("離線");
panel.add(button_leave);
button_leave.addActionListener(this);
this.setVisible(true);
this.name = name;
this.socket = socket;
this.cout = new PrintWriter(socket.getOutputStream(),true);//獲得Socket對象的輸出流,立即flush
this.cout.println(name); //發送自己網名給對方
BufferedReader cin=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//獲得Socket對象的輸入流,創建字元輸入流
String aline=cin.readLine(); //接收到對方網名
text_receiver.append("連接"+aline+"成功"+"\r\n"); //顯示對方發來的內容
aline= cin.readLine();
while (aline!=null && !aline.equals("bye")) //從輸入流接收對方發來的字元串
{ //"bye"是約定的離線信息
text_receiver.append(aline+"\r\n"); //顯示對方發來的內容
aline= cin.readLine();
}
cin.close();
cout.close();
socket.close(); //關閉Socket連接
button_send.setEnabled(false);
button_leave.setEnabled(false);
}
public ChatTCPSocketJFrame(String name, String host, int port) throws IOException //客戶端
{
this(name, new Socket(host, port)); //客戶端向指定主機的埠發出TCP連接請求
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==button_send) //發送按鈕
{
this.cout.println(name+" 說:"+text_sender.getText()); //通過流發送給對方
text_receiver.append("我說:"+text_sender.getText()+"\n");
text_sender.setText("");
}
if (e.getSource()==button_leave) //離線
{
text_receiver.append("我離線\n");
this.cout.println(name+"離線\n"+"bye"); //發送給對方離線約定
button_send.setEnabled(false);
button_leave.setEnabled(false);
}
}
public static void main(String args[]) throws IOException
{
new ChatTCPSocketJFrame("小蜜蜂", "127.0.0.1", 2001);
}
}
//服務端程序
import java.net.*;
import java.io.*;
public class ChatTCPServer
{
public ChatTCPServer(int port, String name) throws IOException //約定埠、網名
{ //本機IP地址和指定埠構成服務端的Socket
ServerSocket server = new ServerSocket(port); //ServerSocket提供TCP連接服務
Socket client = server.accept(); //等待接收客戶端的連接申請
new ChatTCPSocketJFrame(name,client); //服務端的聊天室,圖形用戶界面同客戶端
server.close();
}
public static void main(String args[]) throws IOException
{
new ChatTCPServer(2001, "花仙子"); //啟動服務端,約定埠,指定網名
}
}
『叄』 急缺一個vb網路通信代碼。基於tcp/ip, 要簡單明了,一定要加註解。
TCP連接初步
如果應用程序要使用TCP協議,那麼首先必須決定應用程序是伺服器還是客戶端。
如果要創建一個伺服器端,那麼應用程序需要「監聽」指定的埠。當客戶端提出
連接請求時,伺服器端能夠接受請求並建立連接。在連接建立之後,客戶端與服務
器端可以自由地互相通訊。
下列步驟創建一個非常簡單的伺服器:
要創建一個TCP伺服器,請按照以下步驟執行:
創建新的StandardEXE工程。
將預設窗體的名稱改為frmServer。
將窗體的標題改為「TCP伺服器」。
在窗體中放入一個Winsock控制項,並將它的名字改為tcpServer。
在窗體上添加兩個TextBox控制項。將第一個命名為txtSendData,第二個為txtOutput。
為窗體添加如下的代碼。
PrivateSubForm_Load()
'將LocalPort屬性設置為一個整數。
'然後調用Listen方法。
tcpServer.LocalPort=1001
tcpServer.Listen
frmClient.Show'顯示客戶端的窗體。
EndSub
PrivateSubtcpServer_ConnectionRequest_
(ByValrequestIDAsLong)
'檢查控制項的State屬性是否為關閉的。
'如果不是,
'在接受新的連接之前先關閉此連接。
IftcpServer.State<>sckClosedThen_
tcpServer.Close
'接受具有requestID參數的
'連接。
tcpServer.AcceptrequestID
EndSub
PrivateSubtxtSendData_Change()
'名為txtSendData的TextBox控制項中
'包含了要發送的數據。當用戶往文本框中
'鍵入數據時,使用SendData方法
'發送輸入的字元串。
tcpServer.SendDatatxtSendData.Text
EndSub
PrivateSubtcpServer_DataArrival_
(ByValbytesTotalAsLong)
'為進入的數據聲明一個變數。
'調用GetData方法,並將數據賦予名為txtOutput
'的TextBox的Text屬性。
DimstrDataAsString
tcpServer.GetDatastrData
txtOutput.Text=strData
EndSub
上面的步驟創建了一個簡單的伺服器應用程序。為了使它能夠工作,
還必須為它創建一個客戶端的應用程序。
要創建TCP客戶端,請按照以下步驟執行:
在工程中添加一個新的窗體,將其命名為frmClient。
將窗體的標題改為「TCPClient」。
在窗體中添加一個Winsock控制項,並將其命名為tcpClient。
在frmClient中添加兩個TextBox控制項。將第一個命名為txtSend,第二個為txtOutput。
在窗體上放一個CommandButton控制項,並將其命名為cmdConnect。
將CommandButton控制項的標題改為Connect。
在窗體中添加如下的代碼。
重點必須將RemoteHost屬性值修改為您的計算機的名字。
PrivateSubForm_Load()
'Winsock控制項的名字為tcpClient。
'注意:要指定遠程主機,可以使用
'IP地址(例如:"121.111.1.1"),也可以使用
'計算機的「好聽的名字」如下所示。
tcpClient.RemoteHost="RemoteComputerName"
tcpClient.RemotePort=1001
EndSub
PrivateSubcmdConnect_Click()
'調用Connect方法,初始化連接。
tcpClient.Connect
EndSub
PrivateSubtxtSendData_Change()
tcpClient.SendDatatxtSend.Text
EndSub
PrivateSubtcpClient_DataArrival_
(ByValbytesTotalAsLong)
DimstrDataAsString
tcpClient.GetDatastrData
txtOutput.Text=strData
EndSub
上面的代碼創建了一個簡單的客戶/伺服器模式的應用程序。我們可以將兩者都運行起來:
運行工程,然後單擊「連接」。在兩個窗體之一的txtSendData文本框中鍵入文本,可
以看到同樣的文字將出現在另一個窗體的txtOutput文本框中。