所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接 。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TC P/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网 络编程。
2.客户端和服务器端通过socket发送消息和接收消息的过程:
接收消息的过程
发送消息的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
(1) 创建Socket;
(2) 打开连接到Socket的输入/出流;
(3) 按照一定的协议对Socket进行读/写操作;
(4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
3.简单的Client/Server程序
client
public class ClientSocket {
public void go() throws UnknownHostException, IOException{
/**注意,在选择端口时,必须小心。每一个端口提供一种特定的服务,
* 只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,
* 例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23,
* 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
*/
//向服务器端发送请求,服务器IP地址和服务器监听的端口号
Socket client = new Socket("127.0.0.1", 4242);
//通过printWriter 来向服务器发送消息,client.getOutputStream()从socket获得输出流
PrintWriter print = new PrintWriter(client.getOutputStream());
System.out.println("连接已建立...");
//发送消息
print.println("hello Server 这是测试");
print.flush();
//InputStreamReader是低层和高层串流之间的桥梁
//client.getInputStream()从Socket取得输入串流
InputStreamReader streamReader = new InputStreamReader(client.getInputStream());
//链接数据串流,建立BufferedReader来读取,将BufferReader链接到InputStreamReder
BufferedReader reader = new BufferedReader(streamReader);
String advice = reader.readLine();
System.out.println("接收到服务器的消息:"+advice);
reader.close();
client.close();
}
public static void main(String[] args) throws UnknownHostException, IOException {
ClientSocket client = new ClientSocket();
client.go();
}
}
server端
public class SocketServer {
private ServerSocket ss;
private InputStreamReader streamReader;
private BufferedReader reader;
public void server() throws IOException{
//让服务器端程序开始监听来自4242端口的客户端请求
if(ss==null){
ss = new ServerSocket(4242);
System.out.println("服务器启动...");
}
//服务器无穷的循环等待客户端的请求
while(true){
/**
*accept()方法会在等待用户的socket连接时闲置着,当用户链接
*上来时,此方法会返回一个socket(在不同的端口上)以便与客户端
*通信。Socket与ServerSocket的端口不同,因此ServerSocket可以
*空闲出来等待其他客户端
*/
//这个方法会停下来等待要求到达之后再继续
Socket client = ss.accept();
//获取socket的输入流,来读取客户端输入的内容
streamReader = new InputStreamReader(client.getInputStream());
reader = new BufferedReader(streamReader);
String advice = reader.readLine();
System.out.println("接收到了客户端的请求:"+advice);
//使用printWriter来向客户端反馈内容
PrintWriter out = new PrintWriter(client.getOutputStream());
out.println("I am Server");
out.close();
}
}
public static void main(String[] args) throws IOException {
SocketServer ss = new SocketServer();
ss.server();
}
}