一、多线程网络编程(TCP协议)
1.客户端
- 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
- 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
- 输入流可以读取服务端输出流写出的数据
- 输出流可以写出数据到服务端的输入流
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1", 12345);
//将字节流包装成了字符流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//PrintStream中有写出换行的方法
PrintStream ps = new PrintStream(socket.getOutputStream());
System.out.println(br.readLine());
ps.println("你好");
System.out.println(br.readLine());
ps.println("大家好");
socket.close();
}
注:
- 此处不适用BufferedWriter的原因:BufferedReader中readLine()方法以读入换行符(\r\n)为结束标志,而PrintStream中的println()方法比BufferedWriter中newLine()方法更加方便,所以此处推荐使用PrintStream。
- PrintStream必须使用println()输出,如果使用print()方法可能导致死锁。
2.服务器
- 创建ServerSocket(需要指定端口号)
- 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
- 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
- 输入流可以读取客户端输出流写出的数据
- 输出流可以写出数据到客户端的输入流
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(12345);
while(true) {
final Socket socket = server.accept(); //接受客户端的请求
new Thread() {
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //将字节流包装成了字符流
PrintStream ps = new PrintStream(socket.getOutputStream()); //PrintStream中有写出换行的方法
ps.println("你好");
System.out.println(br.readLine());
ps.println("再见");
System.out.println(br.readLine());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}