一、大体结构:

采用TCP/IP模式的Socket(套接字)通信,实现通过服务端作中转的客户端与客户端之间的通信。

二、当前功能:

  1. 实现简单的客户机之间信息的收发通信;
  2. 通过自定义byte数组与int型间的转换实现传输基本数据类型,完成网络版铅笔;
  3. 客户机每次发送信息前先发送"文本"或"铅笔"选择信息,服务端作中转将信息发送给每个客户机,客户机先接收此选择信息后进入对应模块,完成聊天室与画板间的转换功能
  4. 当一台客户机退出,服务端关闭其对应的流资源,并移除集合中的对应对象,避免资源的浪费

三、代码部分: 

1.ClientStart类:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import javax.swing.JPanel;public class ClientStart extends JPanel implements Runnable,ActionListener,MouseListener,MouseMotionListener{public static void main(String[] args) {ClientStart client=new ClientStart();new Thread(client).start();}JTextArea jta1,jta2;InputStream is;OutputStream os;int x0,y0,x1,y1;Graphics g;
//  int flag=1;ClientStart(){Socket socket=null;try {socket = new Socket("127.0.0.1", 9898);System.out.println("成功建立连接");is = socket.getInputStream();os = socket.getOutputStream();} catch (Exception e) {// TODO: handle exception}JFrame jf=new JFrame();jf.setTitle(socket.getLocalPort()+"客户机");//以端口号给窗体命名this.setBackground(Color.gray);    this.addMouseListener(this);this.addMouseMotionListener(this);JPanel jp=new JPanel();jf.add(jp,BorderLayout.NORTH);jp.setPreferredSize(new Dimension(0,350));jf.add(this,BorderLayout.SOUTH);this.setPreferredSize(new Dimension(0,900));jf.setBounds(300,30,1000,900);jf.setDefaultCloseOperation(3);jta1=new JTextArea();jta2=new JTextArea();jta1.setPreferredSize(new Dimension(400,350));jta2.setPreferredSize(new Dimension(400,350));JButton jb=new JButton();jb.setText("发送");jb.addActionListener(this);jb.setPreferredSize(new Dimension(100,30));jta1.setEditable(false);jp.add(jta1);jp.add(jta2);jp.add(jb);jf.setVisible(true);g=this.getGraphics();}@Overridepublic void run() {try {} catch (Exception e) {// TODO: handle exception}byte[] isMsg=new byte[4]; //接收选择信息byte[] receiveMsg=new byte[20];    //接收聊天信息byte[] buf1=new byte[4];   //一个int型位数对应四个byte位数,长度必须为4int[] spot=new int[4];   //接收x1,y1,x2,y2四个点String Msg="";while(true) {try {int length=is.read(isMsg);Msg=new String(isMsg,0,length);if("铅笔".equals(Msg)) {for(int i=0;i<4;i++) {is.read(buf1);spot[i]=getInt(buf1);}g.drawLine(spot[0], spot[1], spot[2], spot[3]);}else if("文本".equals(Msg)) {int len=is.read(receiveMsg);String msg=new String(receiveMsg,0,len);jta1.append(msg+"\n");}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic void actionPerformed(ActionEvent e) {try {os.write("文本".getBytes());os.write(jta2.getText().getBytes());} catch (IOException e1) {e1.printStackTrace();}jta2.setText("");}@Overridepublic void mousePressed(MouseEvent e) {x0=e.getX();y0=e.getY();}@Overridepublic void mouseDragged(MouseEvent e) {x1=e.getX();y1=e.getY();
//      flag=0;try {os.write("铅笔".getBytes());os.write(getByteArray(x0));os.write(getByteArray(y0));os.write(getByteArray(x1));os.write(getByteArray(y1));} catch (IOException e1) {e1.printStackTrace();}x0=x1;y0=y1;}public byte[] getByteArray(int num){byte[] bt=new byte[4];     // >>右移运算符,>>>无符号右移运算符,即全为正数bt[0]=(byte) ((num>>>0) & 0xff); //0xff十六进制数,int值为255 (位运算符)&与运算,都为1则为1bt[1]=(byte) ((num>>>8) & 0xff);bt[2]=(byte) ((num>>>16) & 0xff);bt[3]=(byte) ((num>>>24) & 0xff);return bt;}public int getInt(byte[]bt){int num=(bt[0]& 0xff)<<0| // <<左移运算符(bt[1]& 0xff)<<8|(bt[2]& 0xff)<<16|(bt[3]& 0xff)<<24; return num;}@Overridepublic void mouseMoved(MouseEvent e) {}@Overridepublic void mouseReleased(MouseEvent e) {}@Overridepublic void mouseEntered(MouseEvent e) {}@Overridepublic void mouseExited(MouseEvent e) {}@Overridepublic void mouseClicked(MouseEvent e) {}
}

2.ServerStart类:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class ServerStart {public static void main(String[] args) {ServerStart server=new ServerStart();try {server.init();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}int flag;List<Socket> sockets=new ArrayList<Socket>();List<InputStream> inputStreams=new ArrayList<InputStream>();List<OutputStream> outputStreams=new ArrayList<OutputStream>();void init() throws Exception{ServerSocket serverSocket=new ServerSocket(9898);System.out.println("服务器开启,端口号为:"+serverSocket.getLocalPort());while(true) {Socket socket=serverSocket.accept();System.out.println("成功连接至客户端"+socket.getInetAddress()+"其端口号为:"+socket.getPort());InputStream is=socket.getInputStream();OutputStream os=socket.getOutputStream();sockets.add(socket);inputStreams.add(is);outputStreams.add(os);new Thread(new ServerThread(is,os,socket)).start();}}class ServerThread implements Runnable{InputStream is;OutputStream os;Socket socket;ServerThread(InputStream is,OutputStream os,Socket socket) {this.is=is;this.os=os;this.socket=socket;}@Overridepublic void run() {while(true) {byte[] buffer=new byte[20];  //须为4的整数倍try {                  int len=is.read(buffer);for(int i=0;i<outputStreams.size();i++) {outputStreams.get(i).write(buffer,0,len);}} catch (IOException e) {System.out.println(socket.getInetAddress()+"客户端已退出,其端口号为:"+socket.getPort());try {//因GC(垃圾回收)只管内存不管别的资源,流资源需手动关闭is.close();os.close();socket.close();} catch (Exception e2) {// TODO: handle exception}//移除集合中的对象ServerStart.this.inputStreams.remove(is);ServerStart.this.outputStreams.remove(os);ServerStart.this.sockets.remove(socket);break;    //退出循环}}}}
}

补充:需先开启服务端,再开启客户端

四、部分效果展示: 

java通信—网络聊天室网络画板(简陋版)相关推荐

  1. 基于UDP的网络聊天室网络编程0811作业-洪庆乐

    项目:基于UDP的网络聊天室 功能:1.服务器日志系统,且可以查看(实现) 2.有用户,其他用户收到这个人登入信息(实现) 3.群发消息(实现) 4.如果有用户下线,其他用户收到下线消息(实现) 5. ...

  2. java多人聊天室与网络画板

    本篇主要是对本人前一篇通信博客在部分功能和代码结构上的优化,以下为前篇博客的地址: java通信-网络聊天室&网络画板(简陋版) 一.代码结构上的优化: 对前篇博客服务器类中最后流的关闭上代码 ...

  3. 网络聊天室(Java)

    摘要 本文阐述了基于Linux环境,Java语言实现的基本聊天室功能,涉及Linux下的Java 语言的Socket编程.以及Java语言的多线程编程. 关键字 Linux         Java  ...

  4. java聊天室测试_Java网络聊天室实训能力测试

    1填空题(2*12=24,每空2分).1)C/S结构是指___客户机/服务器_____,请例举除网络聊天室之外的基于C/S结构的应用程序____________________.2)套接字(socke ...

  5. 基于Socket通信的在线网络聊天室

    文章目录 项目结构 client constans entity util IO server ui other 大致思路 演示 时间:2021/4/20 开发环境: jdk1.8 编译器:idea2 ...

  6. Java网络聊天室---个人博客

    Java网络聊天室 ---个人博客 一.项目简介 功能描述: 使用图形用户界面和socket通信,能实现一个聊天室中多人聊天,可以两人私聊,可以发送文件. 实现类似QQ用户注册.登录.聊天等功能. 参 ...

  7. 视频教程-网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天-Java

    网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富 ...

  8. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

  9. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

最新文章

  1. mysql 查找字符位置_MySQL数据库中如何查看一个字符串在另一个字符串中第一次出现的位置呢?...
  2. 通俗易懂地搞懂决策树(Decision Tree)那些事儿
  3. JVM之强引用、软引用、弱引用、虚引用
  4. 解决AndroidStudio添加ProjectLibary后在编译时遇到的各种问题之解决方式索引(finished with non-zero exit value and so on...)
  5. 改2003远程端口3389的方法!
  6. 2034.股票价格波动-LeetCode
  7. 华为发布AI时代数据中心交换机:让网络瓶颈不再是束缚,AI算力提升一倍
  8. 用c++实现简单单链表,双链表,二叉树类
  9. arguments的类型是Array吗?
  10. 61单片机程序下载一闪而过,下载完成之后没有看到实验现象。
  11. 神经网络模型分类总结
  12. python怎么解压rar文件
  13. 在写CSDN的文章时,如何插入表格并进行简单的配置
  14. Python基础语法---(3)字符串的基本操作和使用
  15. 生成订单核销二维码,扫码完成核销
  16. mysql-快速入门
  17. 素人做知识付费,还有没有机会
  18. flask 分布式蓝图_分布式系统架构蓝图:旋风之旅
  19. 思科命令大全_【思唯网络学院】【汇总】思科网络设备产品型号大全!超全解释~...
  20. 博团队之极限,铸青春之辉煌——疾风三十一初赛

热门文章

  1. Pycharm控制台中文输出乱码怎么办?控制台输出乱码问题的解决方法
  2. android 左右声道,Android立体声pcm的数据结构,左右声道拆分、左右声道反转
  3. 小白福利-手把手教你如何重新安装你的系统
  4. python中 r'', b'', u'', f'' 的含义
  5. 我爱K歌软件 v1.6.6.4001 官方版
  6. 请注意!新办理的电话卡,有以下情况会导致“二次实名”!
  7. 双绞线接头(RJ45)连接方法详解
  8. gif、bmp、jpg、jpeg图片有什么区别
  9. 百度二级域名大全 目前为234个http://www.twocity.cn/blog/article.asp?id=818
  10. 电感感应电压公式v(t)=L*di/dt的推导