Java--Socket通信(双向)

新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端 两个工程的读写操作线程类基本上完全相同

服务端:

import java.io.BufferedReader;  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
public class Server {  
  
    public static final int PORT = 8000;//监听的端口号     
  
    public static void main(String[] args) {    
        Server server = new Server();    
        server.init();    
    }    
  
    public void init() {    
        ServerSocket serverSocket = null;  
        try {    
            serverSocket = new ServerSocket(PORT);    
            while (true) {    
                Socket client = serverSocket.accept();    
                //一个客户端连接就开户两个线程处理读写    
                new Thread(new ReadHandlerThread(client)).start();    
                new Thread(new WriteHandlerThread(client)).start();   
            }    
        } catch (Exception e) {    
            e.printStackTrace();    
        } finally{  
            try {  
                if(serverSocket != null){  
                    serverSocket.close();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }    
}    
  
/*  
 *处理读操作的线程   
 */  
class ReadHandlerThread implements Runnable{  
    private Socket client;  
  
    public ReadHandlerThread(Socket client) {  
        this.client = client;  
    }  
  
    @Override  
    public void run() {  
        DataInputStream dis = null;  
        try{  
            while(true){  
                //读取客户端数据    
                dis = new DataInputStream(client.getInputStream());  
                String reciver = dis.readUTF();  
                System.out.println("客户端发过来的内容:" + reciver);   
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }finally{  
            try {  
                if(dis != null){  
                    dis.close();  
                }  
                if(client != null){  
                    client = null;  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  
  
/*  
 * 处理写操作的线程  
 */  
class WriteHandlerThread implements Runnable{  
    private Socket client;  
  
    public WriteHandlerThread(Socket client) {  
        this.client = client;  
    }  
  
    @Override  
    public void run() {  
        DataOutputStream dos = null;  
        BufferedReader br = null;  
        try{  
            while(true){  
                //向客户端回复信息    
                dos = new DataOutputStream(client.getOutputStream());    
                System.out.print("请输入:\t");    
                // 键盘录入    
                br = new BufferedReader(new InputStreamReader(System.in));  
                String send = br.readLine();    
                //发送数据  
                dos.writeUTF(send);    
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }finally{  
            try {  
                if(dos != null){  
                    dos.close();  
                }  
                if(br != null){  
                    br.close();  
                }  
                if(client != null){  
                    client = null;  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
} 

客户端:

import java.io.BufferedReader;  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.net.Socket;  
  
public class Client {  
  
    public static final String IP = "localhost";//服务器地址   
    public static final int PORT = 8000;//服务器端口号    
  
    public static void main(String[] args) {    
        handler();   
    }  
  
    private static void handler(){  
        try {  
            //实例化一个Socket,并指定服务器地址和端口  
            Socket client = new Socket(IP, PORT);  
            //开启两个线程,一个负责读,一个负责写  
            new Thread(new ReadHandlerThread(client)).start();  
            new Thread(new WriteHandlerThread(client)).start();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}    
  
/*  
 *处理读操作的线程   
 */  
class ReadHandlerThread implements Runnable{  
    private Socket client;  
  
    public ReadHandlerThread(Socket client) {  
        this.client = client;  
    }  
  
    @Override  
    public void run() {  
        DataInputStream dis = null;  
        try {  
            while(true){  
                //读取服务器端数据    
                dis = new DataInputStream(client.getInputStream());  
                String receive = dis.readUTF();     
                System.out.println("服务器端返回过来的是: " + receive);    
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally{  
            try {  
                if(dis != null){  
                    dis.close();  
                }  
                if(client != null){  
                    client = null;  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}  
  
/*  
 * 处理写操作的线程  
 */  
class WriteHandlerThread implements Runnable{  
    private Socket client;  
  
    public WriteHandlerThread(Socket client) {  
        this.client = client;  
    }  
  
    @Override  
    public void run() {  
        DataOutputStream dos = null;  
        BufferedReader br = null;  
        try {  
            while(true){  
                //取得输出流  
                dos = new DataOutputStream(client.getOutputStream());  
                System.out.print("请输入: \t");    
                //键盘录入  
                br = new BufferedReader(new InputStreamReader(System.in));  
                String send = br.readLine();    
                //发送数据  
                dos.writeUTF(send);    
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  finally{  
            try{  
                if(dos != null){  
                    dos.close();  
                }  
                if(br != null){  
                    br.close();  
                }  
                if(client != null){  
                    client = null;  
                }  
            }catch(Exception e){  
                e.printStackTrace();  
            }  
        }  
    }  
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-21(02)总结字符流,IO流编码问题,实用案例必做一遍

C:把集合中的数据存储到文本文件 package cn.itcast_02; import java.io.BufferedWriter; import jav...

3624
来自专栏我是业余自学C/C++的

箱子排序(测试代码Qt5.1 for mac)

975
来自专栏mukekeheart的iOS之旅

Bug修复问题

采用下面的代码,访问网页:http://www.weather.com.cn/data/cityinfo/101010100.html,想读取下图中红框中的内容...

2477
来自专栏我是业余自学C/C++的

扩展的线性表

1843
来自专栏后端之路

跳表在手天下我有之ConcurrentSkipListMap

背景 Jdk给我们提供了大量的map来供我们研发使用。通常情况下我们使用HashMap 需要插入顺序或者访问我们可以使用LinkedHashMap 需要排序我们...

38410
来自专栏DT乱“码”

通过HTTP访问接口,工具方法

/* * 通过HTTP访问接口, * 详情,返回一个Map对象 */ public static Map<String,Object> callByHT...

1899
来自专栏Java后端技术

Java实现文件复制的四种方式

背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制。

593
来自专栏JavaQ

RPC框架的最简单实现

一个最简单的RPC框架实现包含暴露服务、引用服务、Socket通讯三部分。 RPC框架简易实现 public class RpcFramework { ...

3104
来自专栏nice_每一天

Java 实现视频下载功能

2662
来自专栏马洪彪

Java服务器端生成报告文档:使用SQL Server Report Service(SSRS)

SQL Server Report Service(SSRS)提供了Asp.Net和WinForm两类客户端组件封装,因此使用C#实现SSRS报表的导出功能,仅...

3285

扫码关注云+社区