实现原理:
1、主方法:在主方法中构建一个输入流接收键盘的输入,根据接收到的输入信息判定角色是服务器端还是客户端;然后构建相应的socket,开启线程;
2、线程-坚守键盘阵地:接收键盘的输入,将从键盘输入的信息写入到网络中去;
3、线程-坚守网络阵地:从网络中读入信息,并将其打印到控制台;
代码示例:
GoodTcp.java:
package com.lmb;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class GoodTcp {
public static void main(String[] args) throws Exception {
System.out.println("请输入IP和端口号,或直接输入端口号:");
System.out.println("例如:192.168.0.2,8888或者8888");
//构建输入流接收键盘的输入,从输入的信息判断是服务器端还是客户端
String[] ss=new BufferedReader(new InputStreamReader(System.in)).readLine().split(",");
Socket skt=null;
if (ss.length==1) {
//服务器端
skt=new ServerSocket(Integer.parseInt(ss[0])).accept();
}else {
//客户端端
skt=new Socket(ss[0],Integer.parseInt(ss[1]));
}
new KeyTcp(skt).start();//将坚守键盘阵地的线程开启
new NetTcp(skt).start();//将坚守网络阵地的线程开启
}
}
/**
* 坚守键盘阵地,功能:接受键盘的输入,将从键盘写入的信息输出到网络中去
*/
class KeyTcp extends Thread{
private Socket skt;
public KeyTcp(Socket skt) {
this.skt=skt;
}
public void run() {
try {
//构建输入流接收键盘的输入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//构建输出流,将从键盘接收的信息写入到网络
PrintWriter pw=new PrintWriter(skt.getOutputStream());
for (;;) {
String s=br.readLine();
if (s==null) break;
pw.println(s);
pw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 坚守网络阵地,功能:从网络中读入信息,并将其打印到控制台
*/
class NetTcp extends Thread{
private Socket skt;
public NetTcp(Socket skt) {
this.skt=skt;
}
public void run() {
try {
//构建输入流,从网络中读入信息,并将其打印到控制台
BufferedReader br=new BufferedReader(new InputStreamReader(skt.getInputStream()));
for (;;) {
System.out.println(br.readLine());
}
} catch (Exception e) {
System.out.println("对方下线或者掉线……");
}
}
}
运行结果: