使用TCP协议完成一个点对点传输文本的例子
【两个用户都是客户端和服务器端】
一般情况下的服务器端和客户端之间的通信模型如图所示:
用户A
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//TCP协议
public class ChatA {
//构造器
public ChatA(){
try {
ServerSocket server = new ServerSocket(8001);
new Thread(new ARunnable()).start();
Socket socket=null;
while(true){
socket=server.accept();//线程阻塞
//字符流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());//读一行文字
}
} catch (IOException e) {
e.printStackTrace();
}
}
class ARunnable implements Runnable {
@Override
public void run(){
Scanner scanner=new Scanner(System.in);
while(true){
String message=scanner.next();
Socket socket=null;
message="佩奇:"+message;
//A和B进行连接
try {
socket =new Socket("localhost",8002);//IP和端口号
new PrintWriter(socket.getOutputStream(),true).println(message);//自动冲刷
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
new ChatA();
}
}
用户B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ChatB {
public ChatB(){
try {
ServerSocket server = new ServerSocket(8002);//交换端口号
new Thread(new ARunnable()).start();
Socket socket=null;
while(true){
socket=server.accept();//线程阻塞
//字符流
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(br.readLine());//读一行文字
}
} catch (IOException e) {
e.printStackTrace();
}
}
class ARunnable implements Runnable {
@Override
public void run(){
Scanner scanner=new Scanner(System.in);
while(true){
String message=scanner.next();
Socket socket=null;
message="乔治:"+message;
//A和B进行连接
try {
socket =new Socket("localhost",8001);//交换端口号
new PrintWriter(socket.getOutputStream(),true).println(message);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
new ChatB();
}
}
运行结果:
ChatA
ChatB