TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议.
下面用JAVA来实现TCP通信,不啰嗦,直接上代码

客户端代码:
publicclassClient {
//TCP协议进行网络通信
/*
* java.net.Socket
* 封装了TCP协议,使用它就可以基于TCP协议
* 进行网络通讯
* Socklet是运行在客户端的
*/
privateSocket socket;
/*
* 构造方法,初始化客户端
* 实例化Scoket的时候需要传送两个参数
* 1,服务端地址:通过IP地址找到对应的计算机
* 2,服务端端口:通过端口找到计算机上的对应的应用程序
* 实例化的过程就是连接的过程,若是远程计算机没有响应则会抛出异常
*/
publicClient() throws Exception{
socket = new Socket("localhost",8098);
System.out.println("已与服务器建立连接");
}
/*
* 启动客户端的方法
*/
publicvoidstart() {
try{
Scanner scanner =new Scanner(System.in);
/*
* 先要求用户输入一个昵称
*/
String name = null;
while(true) {
System.out.println("请输入昵称");
name =scanner.nextLine();
if(name.length()>0) {
break;//跳出循环
}
System.out.println("输入有误");
}
System.out.println("输入昵称成功");
/*
* Socket提供的方法:
* OutputStream getOutputStream
* 获取一个字节输出流,通过该流写出数据会被
* 发送至远端计算机
*/
OutputStream out =socket.getOutputStream();
OutputStreamWriter osw = newOutputStreamWriter(out,"UTF-8");
PrintWriter pw =new PrintWriter(osw,true);
//先将昵称发送给服务器
pw.println(name);
/*
* 启动线程,读取消息
*/
ServerHandler handler = new ServerHandler();
Thread t = new Thread(handler);
t.start();
/**
* 将字符串发送给服务器
*/
while(true) {
pw.println(scanner.nextLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
publicstaticvoidmain(String[] args) {
try{
Client client =new Client();
client.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("客户端启动失败");
}
}
/*
* 该线程就来读取服务端发送过来的消息
* 并输送到客户端控制台显示
*/
classServerHandler implements Runnable{
publicvoidrun() {
try{
InputStream in = socket.getInputStream();
InputStreamReader isr = newInputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String message = null;
while((message = br.readLine()) != null) {
System.out.println(message);
}
}catch(Exception e) {
}
}
}
}
服务器端代码:
publicclassServer {
/*
* 运行在服务器端的ServerSocket主要负责:
* 1,向系统申请服务端口,客户端就是通过这个端口与之连接
* 2,监听申请的服务端口,当一个客户端通过该端口尝试建立连接时,
* ServerScoket会在服务端创建一个Socket与客户端建立连接
*/
privateServerSocket server;
//保存所有客户 端输出流得集合
privateListallOut;
/*
* 用来初始化服务端的
*/
publicServer() throws Exception{
//初始化的同时申请窗口
server= new ServerSocket(8098);
//不分先后次序
allOut = new ArrayList();
}
/*
* 将给定的输出流存入共享集合
*/
privatesynchronizedvoidaddOut(PrintWriter out) {
allOut.add(out);
}
/*
* 将给定的输出流从共享集合中删除
* 同步(互斥)----synchronized
*/
privatesynchronizedvoidremoveOut(PrintWriter out) {
allOut.remove(out);
}
/*
* 将给顶的消息发送给所有的客户端
* 遍历
*/
privatesynchronizedvoidsendMessage(String message) {
for(PrintWriter out : allOut) {
out.println(message);
}
}
/*
* 服务端开始工作的方法
*/
publicvoidstart() {
try{
/*
* ServerSocket的accept方法是一个阻塞
* 方法,作用是监听服务端口,知道一个客户端
* 连接并创建一个Socket,使用该Socket即可与
* 刚连接的客户端进行交互
*/
while(true) {
System.out.println("等待客户端连接");
Socket socket = server.accept();
System.out.println("一个客户端已经连接");
/*
* 启动一个线程,来完成与该客户端的交互
*/
ClientHandler handler = new ClientHandler(socket);
Thread t =new Thread(handler);
t.start();//线程启动
}
} catch (Exception e) {
e.printStackTrace();
}
}
publicstaticvoidmain(String[] args) {
try{
Server server =new Server();
server.start();
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务端启动失败");
}
}
/*
* 该线程负责处理一个客户端的交互
*第二种创建线程的方式:实现Runnable接口并重写run方法
*/
classClientHandler implements Runnable{
/*
*该线程处理客户端的 Socket
*
*/
privateString name;//用户昵称
privateSocket socket;
//客户端的地址信息
privateString host;
publicClientHandler(Socket socket) {
this.socket =socket;
/*
* 通过socket可以湖区远程计算机的地址信息
*/
InetAddress address = socket.getInetAddress();
//获取ip地址
host = address.getHostAddress();
}
publicvoidrun() {
PrintWriter pw = null;//为了finally使用pw
try{
/*
* Socket提供的方法,获取客户端的消息
* InputStream getInputStream()
* 该方法可以获取一个输入流,从该流读取的数据
* 是从远程计算机发送过来的
*/
//System.out.println(host+"上线了");
InputStream in =socket.getInputStream();
InputStreamReader isr = new InputStreamReader(in,"UTF-8");
BufferedReader br =new BufferedReader(isr);
//先读取一行字符串为昵称
name = br.readLine();
sendMessage(name+"上线了");
/*
* 通过Socket创建输出流用于将消息发送给客户端
*/
OutputStream out =socket.getOutputStream();
OutputStreamWriter osw= new OutputStreamWriter(out,"UTF-8");
pw = new PrintWriter(osw,true);
/*
* 将该客户端的输出流写入共享集合中
*/
addOut(pw);
String message =null;
while((message = br.readLine())!=null) {
//System.out.println(host+"说:"+message);
//广播消息
sendMessage(name+"说:"+message);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
/*
* 处理当前客户端断开后的逻辑
* 当message为null(下线),是走finally
*/
//将客户端的输出流从共享集合中删除
removeOut(pw);
System.out.println(name+"下线了");
try{
socket.close();//关闭与远程计算机链接的端口
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
















