群聊系统要用到通信socket协议,在java中要用到两个类java.net.ServerSocket和

Java.net.Socket.ServerSocket用于创建服务器,而Socket用于创建连接。

简单介绍Socket通信的用法

首先,我们建立一个简单的 “服务器—客户端”一对一的连接来说明如何用socket通信。

1.建立一个服务器ServerSocket  server=new ServerSocket(port);

Port是一个整形数据,表示端口号,端口的范围是0~65534,而0~1024端口是系统预留端口,为避免端口被占用我们可以选择一个较大的数:int port=9900;

2.建立一个链接来连接服务器和客户端。

服务器:Socket socket_server=server.accept();这是一个死等函数,若没有成功建立连接,则程序不会向下执行。

客户端:Socket socket_client=new Socket(IPaddr,port);IPaddr表示你的网络IP地址,本系统在本机上运行可以用127.0.0.1代替,否则可以在命令行下输入ipconfig进行查找。Port为服务器建立的端口号。

3.完成这些以后我们就可以进行服务器和客户端之间的通信了。

发消息需要用到java.io.DataInputStream和java.io.DataOutputStream。

在发送端:DataOutputStream dout=new DataOutputStream(socket_sever.getoutputString);

dout.writeUTF(massage);

接收端:DateInputStream din=new DateInputStream(socket_client.getInputStream);

String accept=din.readUTF();

这样,服务器端和客户端就可以进行简单的通信了。当然,若想时时刻刻都能接收到信息,则必须把接受代码放入线程中让其循环执行。

群聊系统的设计:

服务器:

功能描述:创建一个服务器,接收来自客户端的消息,并分发给每个客户端。

1.建立服务器

public void BuildServer() {try {int port=9900;server = new ServerSocket(port);System.out.println("创建群聊服务器成功!");InetAddress addr=InetAddress.getLocalHost();System.out.println("本机地址:"+addr); //将网络地址和端口打印方便客户端进行连接System.out.println("端口号:"+port);} catch (IOException e) {e.printStackTrace();}}

2.创建socket,由于客户端不止一个,故socket也不只一个,我们可以将Socket=server.accept();循环执行。

    @Override   //这是重写Thread类中的run();public void run() {while (true) {try {Socket socket = server.accept();                 //链接建立后,接收客户端传来的用户名信息DataInputStream in = new DataInputStream(socket.getInputStream());String name=in.readUTF();if (name.equals(""))name="匿名用户";System.out.println(name + "已成功连接!");try {DataOutputStream out = new DataOutputStream(socket.getOutputStream());out.writeUTF(("亲爱的"+name+",你已连接到服务器!\n\r"));} catch (IOException e) {e.printStackTrace();}                //这是一个线程类,之后将会创建,用于与客户端收发消息GroupThread gt = new GroupThread(socket, list, name);                //list是一个链表,存储每个已存在的连接,其初始化:ArrayList<GroupThread> list = new ArrayList<GroupThread>();list.add(gt);gt.start();} catch (IOException e) {}}

3.主函数

public class GroupServer extends Thread {/*** @param 群聊服务器*/ServerSocket server;ArrayList<GroupThread> list = new ArrayList<GroupThread>();public void BuildServer() {}@Overridepublic void run() {}public static void main(String[] args) {GroupServer s = new GroupServer();s.BuildServer();s.start();}}

4.GroupThread类,用于服务器与客户端的收发信息,收到来自客户端的信息后分发出去。

public class GroupThread extends Thread{Socket socket;String str;String accept;ArrayList<GroupThread> list;private String username;public  GroupThread(Socket socket, ArrayList<GroupThread> list,String name){this.socket=socket;this.list=list;this.username=name;}@SuppressWarnings("deprecation")
public void run(){while (true) {try {DataInputStream in = new DataInputStream(socket.getInputStream());accept=in.readUTF();if(!accept.equals("")){sendGroup();}} catch (IOException e) {try {               //客户端关闭后断开连接,将这个链接从链表中移除,并停止线程System.out.println(username+"已断开连接!");list.remove(list.indexOf(this));this.stop();socket.close();} catch (IOException e1) {System.out.println("断开连接出现异常!");}}} }private void sendGroup() {int index=list.indexOf(this);for(int i=0;i<list.size();i++){if(index!=i){list.get(i).Send(accept);}}public void Send(String str){        try {            DataOutputStream out = new DataOutputStream(                    socket.getOutputStream());            out.writeUTF(str);        } catch (IOException e) {            e.printStackTrace();        }    }
}

客户端:

1.登陆界面,提取登录名(未做验证),用于显示群聊过程中的昵称

public class Login extends JFrame {private static final long serialVersionUID = 1L;private JTextField name = new JTextField(9);private JButton login = new JButton("登录");public void showUI() {this.setTitle("请输入你的用户名");this.setSize(300, 240);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setLocationRelativeTo(null);this.setLayout(new FlowLayout());this.setResizable(false);this.add(new JLabel("用户名:"));this.add(name);Listener listener=new Listener(this,name);name.addKeyListener(listener);this.add(login);login.setFocusable(false);login.addActionListener(listener);this.setVisible(true);}public static void main(String[] args) {new Login().showUI();}
}class Listener implements KeyListener,ActionListener{Login login;JTextField jt;private String name;public Listener(Login login,JTextField jt){this.jt=jt;this.login=login;}@Overridepublic void actionPerformed(ActionEvent e) {name=jt.getText();MyChat chat=new MyChat(name);try {chat.runit();} catch (IOException e1) {e1.printStackTrace();}login.setVisible(false);}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {if(e.getKeyCode()==10){name=jt.getText();MyChat chat=new MyChat(name);try {chat.runit();} catch (IOException e1) {e1.printStackTrace();}login.setVisible(false);}}}

2.聊天界面

public class MyChat extends Thread {JButton send = new JButton("发送");JTextField jt = new JTextField(20);JTextArea jta = new JTextArea();DataOutputStream out;Socket socket;String str;byte secret=19;String name;ServerSocket server;JFrame thiss = new JFrame();public MyChat(String name){this.name=name;}public void client() throws IOException {thiss.setSize(400, 300);thiss.setLayout(new BorderLayout());thiss.setDefaultCloseOperation(3);thiss.setLocationRelativeTo(null);JScrollPane js = new JScrollPane(jta);thiss.getContentPane().add(js);thiss.setResizable(false);JPanel south = new JPanel();thiss.add(south, BorderLayout.SOUTH);south.add(jt);send.setFocusable(false);jta.setFocusable(false);jt.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {if (KeyEvent.getKeyText(e.getKeyCode()).equals("Enter")) {str = jt.getText() + "\n\r";jt.setText("");jta.append(name +":" + str);try {out = new DataOutputStream(socket.getOutputStream());out.writeUTF(name +":" + str);} catch (IOException e1) {}};}});send.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent actionEvent) {str = jt.getText() + "\n\r";jt.setText("");jta.append(name+":" + str);try {out = new DataOutputStream(socket.getOutputStream());out.writeUTF((name + ":" + str));} catch (IOException e) {}}});south.add(send);thiss.setVisible(true);}@SuppressWarnings("deprecation")public void run() {while (true) {try {DataInputStream in = new DataInputStream(socket.getInputStream());String accept = in.readUTF();if(!accept.equals(""))jta.append(accept);} catch (IOException e) {try {System.out.println("连接已断开!");socket.close();this.stop();} catch (IOException e1) {e1.printStackTrace();}} }}public void connect() {try {String addr="127.0.0.1";//本机地址socket = new Socket(addr, 9900);out = new DataOutputStream(socket.getOutputStream());out.writeUTF(name);thiss.setTitle(name);} catch (IOException e) {}}public void runit() throws IOException{this.client();this.connect();this.start();if(name.equals("")){name="匿名";thiss.setTitle("匿名");}}
}

运行结果:

转载于:https://www.cnblogs.com/xiao-v/p/4673457.html

socket通信 _ 一个简单的群聊系统相关推荐

  1. 利用Socket实现一个简单的群聊系统

    系统需求 1.实现多个用户即时通信的群聊功能 实现分析 1.当服务端接入一个客户端时,为避免阻塞,并接受其他客户端的接入,为该socket开一个线程管理它. 2.当所接入的客户端中,有客户端发送信息时 ...

  2. Java NIO 应用案例:实现一个简单的群聊系统

    1 案例要求 编写一个 NIO 多人群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞): 服务器端功能: 监测用户上线,离线: 实现客户端消息的转发功能(将该客户端的消息转发给其它客户端): ...

  3. Netty之实现一个简单的群聊系统

    要求 编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 实现多人群聊 服务器端:可以监测用户上线,离线,并实现消息转发功能 客户端:通过channel可以无阻塞发送消息 ...

  4. php 跳转qq群代码_一个简单QQ群聊案例代码解析(PHP实现)

    问题: 使用面向对象编程的方式实现以下业务逻辑: 1. 张三使用账号a,密码b登录了qq 2. 显示出张三最后的登录的时间 3. 张三查看了 1小时内的行政部门群的信息(这个群里有张三,李四,王五,其 ...

  5. 使用Netty编写一个简单的群聊系统

    概述 具体业务跟下面文章的一样,只是下面文章用的是NIO,这里使用Netty改造. https://blog.csdn.net/qq_40837310/article/details/11124848 ...

  6. php一个简单的投票系统_一个简单的PHP投票系统

    一个简单的PHP投票系统 分享到: 作者:转接卡 建立2个表,一个用来显示当前主题,一个存放历史结果. 当前主题表结构:选项(包括主题),票数 历史结果表结构:id,主题名,关点,投票开始时间,投票结 ...

  7. Netty:实现群聊系统+自定义名称+空闲检测+Protobuf

    作为一个Java小白,持续学习是不可避免的,近期学习了Netty的相关知识,使用Netty实现了一个简单的群聊系统,使用Protobuf进行传输,支持空闲心跳检测,并且可以自定义群聊名称,所以写了此篇 ...

  8. socket通信实例(简单的聊天室)

    这次程序运用socket通信实现一个简单的聊天室. 一开始是想在控制台实现,但遇到问题是输出和输入都在一个界面上,最后还是编一个swing程序来实现. 服务器对每一个客户端分配一个线程,run函数实现 ...

  9. iOS微信QQ聊天界面的UI框架以及Socket简单实现群聊功能

    7.1日更新 Python3 TCP Demo相关 https://blog.csdn.net/Deft_MKJing/article/details/80851879 2.2日更新,socket简易 ...

最新文章

  1. android 应用变量,Android全局应用变量的使用
  2. 30年后,请再来看霍金的“人工智能威胁论”
  3. openstack搭建之-neutron配置(11)
  4. LAMP源码编译安装配置+wordpress
  5. CSRF 1 (转)
  6. Oracle入门(十四.20)之创建DML触发器:第一部分
  7. django登录跳转到另一个页面_[JWT]djangojson web token实现单用户登录
  8. 红旗linux培训文档,Linux基本应用培训-红旗Linux.ppt
  9. sendRedirec forward
  10. TS各个表 与 SECTION 的解析 CAS原理
  11. SQL 数据库基本操作
  12. 【Linux驱动开发】PS2游戏手柄驱动开发与输入子系统框架
  13. mysql闪现_css,javascript_点击按钮出现弹窗,弹窗只是闪现了一下,为什么没有一直出现?,css,javascript - phpStudy...
  14. 一篇文章看明白 TCP/IP,TCP,UDP,IP,Socket 之间的关系
  15. 基因结构图的0_肿瘤基因突变Biomarkers的药物研究神器—OncoKB数据库
  16. 牛客网暑期ACM多校训练营(第二场)
  17. 牛客练习赛107 A~D除C
  18. 国内优秀的设计公司有哪些?
  19. 解决谷歌浏览器提示您的链接不是私密链接
  20. sql PK FK 区别

热门文章

  1. 【JQuery】ajax 调用
  2. WebLogic 12c 添加默认应用
  3. 用符号方法求下列极限或导数matlab,实验7答案 Matlab符号计算
  4. php无限分类原理,php 递归无限级分类原理和实现代码
  5. php上传查询excel到mysql_PHP上传Excel文件导入数据到MySQL数据库示例
  6. mysql用in报错_Mysql子查询IN中使用LIMIT
  7. java学习体会论文_Java I/O学习心得一
  8. 【转】节点预测与边预测任务实践
  9. Spark Streaming(三)zookeepe搭建
  10. shutil模块,为什么说它是os模块的兄弟模块?