| 查看: 811 | 回复: 4 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[求助]
socket通信 已有1人参与
|
||
|
请问有谁有一个简版的java socket通信程序吗?能用enter键发送消息,显示时间,选取文件这些基础功能,谢谢了 发自小木虫Android客户端 |
» 猜你喜欢
全日制(定向)博士
已经有5人回复
假如你的研究生提出不合理要求
已经有10人回复
萌生出自己或许不适合搞科研的想法,现在跑or等等看?
已经有4人回复
Materials Today Chemistry审稿周期
已经有4人回复
参与限项
已经有3人回复
实验室接单子
已经有4人回复
对氯苯硼酸纯化
已经有3人回复
求助:我三月中下旬出站,青基依托单位怎么办?
已经有12人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
前壳档案
木虫 (小有名气)
- 应助: 5 (幼儿园)
- 金币: 2433.1
- 红花: 3
- 帖子: 229
- 在线: 36.4小时
- 虫号: 2594487
- 注册: 2013-08-13
- 性别: GG
- 专业: 病毒学

5楼2018-01-12 10:46:33
2楼2017-12-29 11:30:12
前壳档案
木虫 (小有名气)
- 应助: 5 (幼儿园)
- 金币: 2433.1
- 红花: 3
- 帖子: 229
- 在线: 36.4小时
- 虫号: 2594487
- 注册: 2013-08-13
- 性别: GG
- 专业: 病毒学
【答案】应助回帖
|
package chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; /** * 聊天室客户端 * @author adminitartor * */ public class Client { /* * java.net.Socket * 封装了TCP通讯协议,使用它与远程计算机进行 * 网络通讯。 */ private Socket socket; /** * 构造方法,用来初始化客户端 * @throws IOException * @throws UnknownHostException */ public Client() throws UnknownHostException, IOException{ /* * 实例化Socket是需要传入两个参数 * 1:服务端ip地址 * 2:服务端端口 * 通过IP地址可以找到网络上的服务端所在的计算机 * 通过端口可以连接到该计算机上的服务端应用程序 * * 实例化Socket的过程就是建立连接的过程,所以若 * 连接服务端失败,这里会抛出异常。 */ System.out.println("正在与服务端建立连接..." ;socket = new Socket("localhost",8088); System.out.println("与服务端连接成功!" ;} /** * 客户端的启动方法,从这里开始执行客户端逻辑 */ public void start(){ try { Scanner scanner = new Scanner(System.in); OutputStream out = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8" ;PrintWriter pw = new PrintWriter(osw,true); //启动读取服务端发送过来消息的线程 ServerHandler handler = new ServerHandler(); Thread t = new Thread(handler); t.start(); String line = null; System.out.println("开始聊天吧!" ;//上次发送后的时间 long lasttime = System.currentTimeMillis(); while(true){ line = scanner.nextLine(); long curr = System.currentTimeMillis(); //本次发送时间与上次发送时间要间隔1秒以上 if(curr-lasttime>1000){ pw.println(line); lasttime = curr; }else{ System.out.println("说话速度太快!" ;} } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { Client client = new Client(); client.start(); } catch (Exception e) { e.printStackTrace(); System.out.println("客户端启动失败!" ;} } /** * 该线程用来循环接收服务端发送过来的消息并输出到 * 客户端自己的控制台上 * @author adminitartor * */ private class ServerHandler implements Runnable{ public void run(){ try { InputStream in = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(in,"UTF-8" ;BufferedReader br = new BufferedReader(isr); String message = null; while((message = br.readLine())!=null){ System.out.println(message); } } catch (Exception e) { } } } } |

3楼2018-01-12 10:44:33
前壳档案
木虫 (小有名气)
- 应助: 5 (幼儿园)
- 金币: 2433.1
- 红花: 3
- 帖子: 229
- 在线: 36.4小时
- 虫号: 2594487
- 注册: 2013-08-13
- 性别: GG
- 专业: 病毒学
【答案】应助回帖
|
package chat; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** * 聊天室服务端 * @author adminitartor * */ public class Server { /* * java.net.ServerSocket * 运行在服务端的ServerSocket主要有两个作用 * 1:申请服务端口 * 2:监听服务端口,一旦一个客户端通过该端口建立 * 连接,则创建一个Socket用于与该客户端通讯 */ private ServerSocket server; /* * 该集合用来存放所有客户端的输出流,用于将消息 * 广播给所有客户端 */ private List<PrintWriter> allOut; public Server() throws IOException{ /* * 初始化ServerSocket的同时需要指定服务端口 * 该端口号不能与系统其他应用程序已申请的端口 * 号重复,否则会抛出异常。 */ server = new ServerSocket(8088); allOut = new ArrayList<PrintWriter>(); } public void start(){ try { /* * ServerSocket提供方法: * Socket accept() * 该方法会监听ServerSocket申请的服务端口 * 。这是一个阻塞方法,直到一个客户端通过 * 该端口连接才会返回一个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(); } } /** * 将给定的消息广播给所有客户端 * @param message */ private void sendMessage(String message){ synchronized (allOut) { //转发给所有客户端 for(PrintWriter o : allOut){ o.println(message); } } } public static void main(String[] args) { try { Server server = new Server(); server.start(); } catch (Exception e) { e.printStackTrace(); } } /** * 该线程用来完成与指定客户端交互的工作 * @author adminitartor * */ private class ClientHandler implements Runnable{ /* * 当前线程通过这个Socket与指定客户端交互 */ private Socket socket; /* * 远程计算机地址信息,这里是客户端的地址 */ private String host; public ClientHandler(Socket socket){ this.socket = socket; /* * 通过Socket可以获取远端计算机地址信息 */ InetAddress address = socket.getInetAddress(); /* * 获取远端计算机IP地址的字符串格式 */ host = address.getHostAddress(); } public void run(){ PrintWriter pw = null; try { /* * InputStream getInputStream() * Socket提供的该方法可以获取一个输入流, * 通过该流客户读取到远端计算机发送过来 * 的数据。 */ InputStream in = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(in,"UTF-8" ;BufferedReader br = new BufferedReader(isr); /* * 通过Socket获取输出流,用于将数据发送 * 给客户端 */ OutputStream out = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8" ;pw = new PrintWriter(osw,true); /* * 将该客户端的输出流存入到共享集合中 * * 由于多个线程都会调用该集合的add方法向其中 * 添加输出流,所以为了保证线程安全,可以将 * 该集合加锁。 */ synchronized (allOut) { allOut.add(pw); } sendMessage(host+"上线了!,当前在线"+allOut.size()+"人" ;String message = null; while((message = br.readLine())!=null){ // System.out.println(host+"说:"+message); //回复给当前客户端 // pw.println(host+"说:"+message); sendMessage(host+"说:"+message); } } catch (Exception e) { } finally{ //处理客户端断开连接以后的工作 synchronized (allOut) { //将该客户端的输出流从共享集合中删除 allOut.remove(pw); } sendMessage(host+"下线了!,当前在线"+allOut.size()+"人" ;if(socket != null){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } } |

4楼2018-01-12 10:45:16












回复此楼
;