项目场景:
TCP实现点对点通信
问题描述
针对前几次发表的文章进行优化,之前的代码一直是客户端和服务端分角色来进行通信
解决方案:
服务端和客户端代码进行整合,放到一个文件中来
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;
/**
* 发送消息
*/
class sendmsg extends Thread{
private Socket socket;
private Scanner scanner;
public sendmsg(Socket socket,Scanner scanner){
this.socket = socket;
this.scanner = scanner;
}
@Override
public void run() {
this.sendMsg();
}
/**
* 发送xiaoxi
*/
private void sendMsg(){
try(PrintWriter pw = new PrintWriter(socket.getOutputStream());
){
while (true){
String msg = scanner.nextLine();
pw.println(msg);
pw.flush();
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 接收消息的线程
*/
class Receive1 extends Thread{
private Socket socket;
public Receive1(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
this.receiveMsg();
}
/**
* 接收消息
*/
private void receiveMsg() {
//创建用于接收对方消息的流对象
try(BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
){
while (true){
String msg = br.readLine();
System.out.println("他说:"+msg);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public class GoodTCP {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
try{
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:server,<port> 或者:<ip>,<port>");
String str = scanner.nextLine();
//通过切割字符串得到arr数组
String[] arr = str.split(",");
if("server".equals(arr[0])){
//启动服务端
System.out.println("TCP Server Listen at"+arr[1]+"....");
//把字符串类型的转化为整型;
serverSocket = new ServerSocket(Integer.parseInt(arr[1]));
socket = serverSocket.accept();
}else {
//启动客户端
socket = new Socket(arr[0],Integer.parseInt(arr[1]));
System.out.println("连接成功");
}
//启动发送消息的线程
new sendmsg(socket,scanner).start();
new Receive1(socket).start();
}catch (Exception e){
e.printStackTrace();
}finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
注意:需要两次运行该程序
如果运行失败,可能需要设置一下允许多个实例运行;
可以参考这个连接IDEA同一服务开多个实例的方法 - 知乎