所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
简单点来理解,通过Socket可以在两个不同主机的进程之间,建立通信管道。为了更方便的理解这个过程,可以参考下图:
既然是两个主机之间的通讯,因此,Socket也有两部分组成:提供服务的Server端和请求服务的Client端。两端通过Socket可以建立连接,并进行通信。
为了简单的理解整个通信的过程,给出实例代码和注释,感兴趣的可以直接在本地运行测试。
客户端代码,如下所示:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketClient {
//默认端口号
private String ip = null;
private int port = 8888;
public SocketClient(String ip, int port) {
super();
this.ip = ip;
this.port = port;
}
public boolean startClient() {
try {
Socket socket = new Socket(ip,port);
InputStream isockets = socket.getInputStream();
OutputStream osockets = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(osockets));
//向服务器端发送一条消息
bw.write("test\n");
bw.flush();
//读取服务器返回的消息
BufferedReader br = new BufferedReader(new InputStreamReader(isockets));
String mess = br.readLine();
System.out.println("Sever Message:"+mess);
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
public static void main(String[] args) {
SocketClient sc = new SocketClient("127.0.0.1",1234);
sc.startClient();
}
}
服务端代码,如下所示:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
//默认端口号
private int port = 8888;
public SocketServer(int port) {
super();
this.port = port;
}
@SuppressWarnings({ "static-access", "resource" })
public boolean startServer() {
try {
ServerSocket server = new ServerSocket(port);
System.out.println("Server Started...");
Socket socket = null;
//等待客户端连接
while((socket = server.accept())!= null) {
System.out.println("Client IP: "+socket.getInetAddress().getLocalHost()+" is Connected");
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String message = null;
//读取客户端消息
while((message = br.readLine())!=null) {
System.out.println("Client Message : "+message);
//返回客户端信息
bw.write("Received \n");
bw.flush();
}
System.out.println("Client is Closed");
}
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
public static void main(String[] args) {
SocketServer ss = new SocketServer(1234);
ss.startServer();
}
}
有任何Socket编程方面的问题,欢迎留言提问!