TCP 协议 的 C/S程序
我们需要使用到两个类来编写TCP协议的C/S程序,双方使用socket(套接字,通信端点)进行交流:
- ServerSocket:搭建服务器
- Socket:搭建客户端
ServerSocket
用于创建服务器。创建完毕后, 会绑定一个端口号。注意:参数port的范围是: 0-65535 (建议1025-65535)
然后此服务器可以等待客户端连接。Socket accept():此方法会导致线程的阻塞! 直到一个新的客户端连接成功, return Socket对象后, 线程在继续执行。
每连接一个客户端 , 服务器就会得到一个新的Socket对象, 用于跟客户端进行通信 .
close():释放占用的端口号 , 关闭服务器.
public class SocketDemo {
public static void main(String[] args) throws IOException {
//搭建服务器
ServerSocket server = new ServerSocket(55565);
System.out.println("服务器搭建完成");
//等待客户端连接
Socket socket = server.accept();
System.out.println("客户端已连接");
}
}
之后开启客户端:
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
//客户端连接
Socket socket = new Socket("localhost",55565);
}
}
之后想要接收发送消息就可以使用输入输出流:
- OutputStream getOutputStream(); 返回的是 , 指向通信的另一端点的输出流
- InputStream getInputStream();返回的是 , 指向通信的另一端点的输入流
一个简单示例:服务器向客户端发送消息
public class SocketDemo {
public static void main(String[] args) throws IOException {
//搭建服务器
ServerSocket server = new ServerSocket(55564);
System.out.println("服务器搭建完成");
//等待客户端连接
Socket socket = server.accept();
System.out.println("客户端已连接");
//新建一个输出流
OutputStream os = socket.getOutputStream();
//将输出流转换为打印流
PrintStream ps = new PrintStream(os);
ps.println("欢迎连接服务器!");
}
}
public class ClientDemo {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("localhost",55564);
//新建一个输入流
InputStream is = socket.getInputStream();
//将输入字节流转换为字符流然后利用缓冲流输出
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println("客户端接收到的内容为:"+text);
}
}
同样,客户端也可以向服务器发送消息。
但是要注意:在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的。
所以在使用时, 需要注意以下一点规则: 客户端与服务器获取流的顺序必须是相反的:
例如:客户端先得到了输入流 , 那服务器必须先获取输出流