TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
Socket,也在套接字。通常用来实现Client-Server的连接。
它的开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
在客户端如何建立Socket连接?
要连接到其他的机器上,我们会需要Socket的连接。Socket是个代表两台机器之间网络连接的对象。要创建Socket连接要知道两项关于服务器的信息:它在哪里以及用哪个端口来收发数据。也就是说IP地址与端口。
Socket chatSocket = new Socket(“192.168.1.10”,3000);
以上参数分别是IP地址和TCP端口(端口应介于1024~65535之间的数字)。
Socket连接的建立代表两台机器之间存有对方的信息,包括网络地址和TCP端口。
它们彼此知道对方,才能够找到对方进行通信。
在服务端如何建立Socket连接?
服务器应用程序对特定端口创建出ServerSocket,让服务器开始监听来自3000端口的客户请求
ServerSocket server_socket = new ServerSocket(3000);
服务器创建出与客户端通信的新Socket
Socket socket = server_socket.accept();
客户端代码示例(T1_Client.java)
importjava.net.*;
importjava.io.*;
publicclass T1_Client{
public static void main ( String[] args )throws Exception
{
//1、客户端对服务器应用程序建立Socket连接
Socket socket = new Socket("127.0.0.1",5000);
//2、键盘输入流
BufferedReader input = newBufferedReader ( new InputStreamReader ( System.in ) );
//3、从socket对象中获取数据输出对象
PrintWriter output = newPrintWriter ( socket.getOutputStream(),true );
//4、不断获取用户输入,并发送给服务端
while(true){
String lineToBeSent =input.readLine();
//如果用户输入".",终止循环
if ( lineToBeSent.equals ("." ) ) break;
output.println (lineToBeSent );
}
//5、结束通讯
socket.close();
}
}
服务端代码示例(T1_Server.java)
importjava.net.*;
importjava.io.*;
public classT1_Server{
public static void main ( String[] args)throws Exception
{
//1、服务器应用程序对特定端口创建出ServerSocket,让服务器开始监听来自5000端口的客户请求
ServerSocket server_socket = newServerSocket(5000);
//2、服务器等待客户端的连接
while(true){
//服务器创建出与客户端通信的新Socket
Socket socket =server_socket.accept();
BufferedReader input = newBufferedReader ( new InputStreamReader ( socket.getInputStream() ) );
while(true){
String message =input.readLine();
if ( message==null )break;
System.out.println (message );
}
socket.close();
System.out.println ("Connection closed by client" );
}
//accept()方法会在等待用户的Socket连接时闲置着。当一个用户连上来时,此方法会返回一个Socket(在不同的端口上)以便与客户端通信。由于客户端中断连接,才去继续accept()等待下一个客户端进入,因此,无法同时处理多个客户端的连接!!
}
}