在学习网络编程的时候,实现了简单的聊天室功能,但是,此聊天室只能以如下流程实现:
客户端发送消息 —> 服务器端接收消息 —> 服务器端发送消息 —> 接收端接收消息
代码如下
1.服务器端

package testttt;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class Sever1 {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(9999);//监听客户端连接Socket socket = serverSocket.accept();InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();DataInputStream dataInput = new DataInputStream(in);DataOutputStream dataOut = new DataOutputStream(out);Scanner sc = new Scanner(System.in);while (true){String m = dataInput.readUTF();System.out.println("来自客户端的消息:"+m);System.out.println("服务器端输入:");String msg = sc.next();dataOut.writeUTF(msg);}}
}

2.客户端

package testttt;import java.io.*;
import java.net.Socket;
import java.util.Scanner;public class Client1 {public static void main(String[] args) throws IOException {//监听客户端连接Socket socket = new Socket("127.0.0.1", 9999);Scanner sc = new Scanner(System.in);InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();DataInputStream dataInput = new DataInputStream(in);DataOutputStream dataOut = new DataOutputStream(out);while (true){System.out.println("客户端输入:");String msg = sc.next();dataOut.writeUTF(msg);//输出一个字符串String m = dataInput.readUTF();System.out.println("服务器端消息:"+m);dataInput.close();dataOut.close();}}
}

那么怎么实现类似于微信聊天那种无论那一方发送多少的消息,另一方都可以接收并输出呢?
代码如下
1.发送类

package Demo;import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;public class SendThread extends Thread{private Socket socket;private DataOutputStream out;public SendThread(Socket socket) throws IOException {this.socket = socket;this.out = new DataOutputStream(socket.getOutputStream());}@Overridepublic void run() {Scanner sc = new Scanner(System.in);while(true){String s = sc.next();if(socket.isClosed()||s.equals("886")){break;}try {out.writeUTF(s);} catch (IOException e) {e.printStackTrace();}}try {socket.close();} catch (IOException e) {e.printStackTrace();}}
}

2.接收类

package Demo;import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;public class ReciveThread extends Thread{private Socket socket;private DataInputStream in;public ReciveThread(Socket socket) throws IOException {this.socket = socket;this.in = new DataInputStream(socket.getInputStream());}@Overridepublic void run() {while(true){try {String s = this.in.readUTF();System.out.println(s);} catch (IOException e) {e.printStackTrace();}}}
}

此时只需要在服务器端和客户端new对象就行了
3.服务器端

package Demo;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Sever {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(9999);Socket socket = serverSocket.accept();new SendThread(socket).start();new ReciveThread(socket).start();}
}

4.客户端

package Demo;import java.io.IOException;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",9999);new SendThread(socket).start();new ReciveThread(socket).start();}
}

如图所示
1.服务器端

2.客户端

【java奇思妙想】使用多线程的思想来实现java网络编程接收和发送的问题相关推荐

  1. Java网络编程(二) 连续发送数据

    有了建立连接的基础后,接下来尝试连续地发送和接收数据. 对于发送端比较好理解,有数据时就可以发送出去.对于接收端,就需要一直监听是否有数据发送过来.一个基本的方法就是使用 while(true) 循环 ...

  2. Java项目模拟QQ群聊和私聊(网络编程+多线程)

    [文末获取资源] 前几天学习了多线程,最近在学习网络编程,了解了UDP之后又学习了TCP,听一下大佬说,要看看你这两个东西掌握的怎么样,最好的办法就是写一个模拟QQ群聊和私聊,经过这几天的学习,以及不 ...

  3. 5_异常_多线程_设计模式_IO流_网络编程_反射

    JavaSE_第五周 异常 异常的概念 什么是异常 概念 概念:程序在运行过程中出现的特殊情况异常-----通过Jvm将异常的信息打印在控制台---告诉开发者(当前程序在某个环节出现了哪些问题!) 异 ...

  4. Java SE基础知识详解第[18]期—网络编程(通信)

    写在前面: 每一个不曾起舞的日子,都是对生命的辜负. 希望看到这里的每一个人都能努力学习,不负韶华,成就更好的自己. 以下仅是个人学习过程中的一些想法与感悟,Java知识博大精深,作为初学者,个人能力 ...

  5. Java从接触到放弃(二十一)--网络编程

    Day Twenty-One 网络编程 网络编程中有两个主要的问题 如何准确的定位到网络上的一台或者多台主机 找到主机之后如何进行通信 网络编程中的要素 IP和端口号 网络通信协议 udp,tcp I ...

  6. Java程序猿必学第二十二篇—— 网络编程

    //1.File相关 //1.1 FileFilter //FileFilter:文件过滤器 //listFiles方法用于将当前层的文件和目录的File对象放入数组 //FileFilter则是在放 ...

  7. java 指针_java多线程学习二十二:::java中的指针

    在上面那个图,我们看到一个特殊的变量unsafe,它的包名是 sun.misc.Unsafe;从名字看,这个类应该是封装一些不安全的操作,为什么不安全?对c语言理解的朋友就知道了,指针是不安全的,在j ...

  8. java 视图对象转换,使用spring boot开发时java对象和Json对象转换的问题_JavaScript_网络编程...

    将java对象转换为on对象,市面上有很多第三方jar包,如下: jackson(最常用) com.fasterxml.jackson.core jackson-databind 2.11.2 gso ...

  9. [Java网络编程基础]TCP发送和接收数据

    代码如下: package ClientPack;import java.io.IOException; import java.io.OutputStream; import java.net.In ...

最新文章

  1. 手机QQ会员H5加速方案——sonic技术内幕
  2. Zookeeper --笔记
  3. stm32怎么查看什么原因引起的nmi_为什么会有口臭,口臭是什么原因引起的,口臭是怎么回事...
  4. android pcm频谱_Android音频可视化
  5. 重磅!神策智能推荐获 2019 大数据“星河奖”
  6. 运算放大器基本公式_运算放大器积分器的些微差异
  7. 为什么async/await方法不能有lock或Monitor
  8. Java String类型数据的字节长度
  9. Camera中对焦模式总结
  10. c语言静态变量和静态函数
  11. 移动边缘计算中的资源管理
  12. Django - 安装wagtail
  13. Apple Final Cut Pro X 10.4.6 中文特别版 Mac 最强大视频后期制作软件
  14. 芯片数据分析步骤4 标准化-affy
  15. Openjudge:数字统计
  16. android键盘管理,用鼠标键盘控制你的Android手机完整图文教程
  17. echarts 绘制省份地图 [ 把不同省份的市合并在一起 ]
  18. centos7.4/rehat7.0系统安装
  19. 【推荐系统】深度学习大行其道,个性化推荐如何与时俱进?
  20. 计算机组装所需要的部件,组装一台电脑需要哪些配件【详细列举】

热门文章

  1. 微信小程序点击复制文本到剪切板,获取剪切板内容
  2. python使用rpa需要什么插件_使用Python制作ArcGIS插件基础篇——工具介绍
  3. stm32f407 6路串口dma如何配置_stm32cubeMX学习十、扫码模块程序开发(基于正点原子STM32F407开发板)...
  4. OpenCV 图像金字塔buildPyramid、pyrDown、pyrUp
  5. WPF 从文件加载字体
  6. easyui tab页面关闭根据回调函数刷新父tab页
  7. python中关于字典的基础运用
  8. CentOS connect:fail, reason: connect server 22 port fail
  9. 【李宏毅2020 ML/DL】P58 Unsupervised Learning - Neighbor Embedding | LLE, t-SNE
  10. java 事件cancel_Activiti结束事件(End Event)