目的:实现多个客户之间的通信

首先,这个聊天器的框架是这样的:

对于服务器端:建立socket,连接到服务器,并且开始监听。

  1. import java.io.*;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.net.*;
  5. public class MultiTalkServer{
  6. static int clientnum = 0;
  7. //创建一个arraylist数组来保存socket,
  8. public static List <Socket> socketList = new ArrayList <Socket>();
  9. public static void main(String args[])throws IOException{
  10. ServerSocket serverSocket = null;
  11. boolean listening = true;
  12. try {
  13. serverSocket= new ServerSocket(4700);
  14. System.out.println("欢迎来到聊天室。");
  15. }catch(IOException e) {
  16. System.out.println("Could not listen on port:4700.");
  17. System.exit(-1);
  18. }
  19. while (listening) {
  20. clientnum++;
  21. Socket st = serverSocket.accept();//先创建一个socket
  22. //此处会阻塞,等待接收
  23. socketList.add(st);//将这个线程添加到list里
  24. System.out.println("上线通知: 用户" + clientnum+"上线啦!");
  25. new ServerThread(st,clientnum).start();//再创建一个服务端线程
  26. }
  27. serverSocket.close();
  28. }
  29. }

服务器线程:

  1. import java.io.*;
  2. import java.net.*;
  3. public class ServerThread extends Thread{
  4. Socket socket = null;//服务器的套接字
  5. int clientnum;
  6. String line;
  7. //将line定义在外面
  8. public ServerThread(Socket socket,int num){
  9. this.socket=socket;
  10. clientnum=num+1;
  11. }
  12. public void run() {
  13. try {
  14. BufferedReader is = new BufferedReader(new
  15. InputStreamReader(socket.getInputStream()));//is:从缓存区读入
  16.  
  17. PrintWriter os = new PrintWriter(socket.getOutputStream());//os:从缓存区输出
  18.  
  19. BufferedReader sin = new BufferedReader(
  20. new InputStreamReader(System.in));//系统标准输入
  21.  
  22. System.out.println("Client:"+clientnum+is.readLine());//显示从客户端读入的对象,在这里等待客户端输入
  23.  
  24. line=sin.readLine();
  25. //前面是初始化
  26. while(!line.equals("bye")) {
  27. os.println(line);//向客户端输出该字符串
  28. os.flush();//刷新,让客户端接收到
  29. System.out.println("Server:"+line);//显示服务端读入的字符
  30. System.out.println("Client:"+clientnum+is.readLine());//再次从客户端读入字符串
  31. line=sin.readLine();//从服务端读入字符
  32. }
  33. os.close();
  34. is.close();
  35. socket.close();
  36.  
  37. }catch(Exception e) {
  38. System.out.println("Error:"+e);
  39. }
  40. }
  41. }

客户端:

  1. import java.net.*;
  2. import java.io.*;
  3. public class TalkClient{
  4.  
  5. public static void main(String args[]){
  6. try {
  7. Socket socket = new Socket("127.0.0.1",4700);
  8. System.out.print("已连接成功,");
  9. new Thread(new ClientThread(socket)).start();
  10. new Thread(new ClientThread2(socket)).start();
  11. }catch(Exception e) {
  12. System.out.println("Error"+e);
  13. }
  14.  
  15. }
  16. }

客户端线程1:

  1. import java.io.*;
  2. import java.net.*;
  3. public class ClientThread extends Thread{
  4. Socket socket;
  5. String line;
  6. public ClientThread(Socket socket) {
  7. this.socket = socket;
  8.  
  9. }
  10. public void run(){
  11. try {
  12. BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
  13. PrintWriter out = new PrintWriter(socket.getOutputStream());
  14. while(true) {
  15. line = is.readLine();
  16. out.println(line); //向服务器输入;
  17. out.flush();
  18. }
  19. }catch(Exception e){
  20. System.out.println("Error:"+e);
  21. }
  22. }
  23. }

客户端线程2:

  1. import java.io.*;
  2. import java.net.*;
  3. public class ClientThread2 extends Thread{
  4. Socket socket;
  5.  
  6. public ClientThread2(Socket socket) {
  7. this.socket = socket;
  8. }
  9. public void run(){
  10. try {
  11. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  12. while(true) {
  13. String line = in.readLine();
  14. System.out.println(line);
  15. }
  16. }catch(Exception e){
  17. System.out.println("Error:"+e);
  18. }
  19. }
  20. }

展示结果:

java socket通信:聊天器(1)的更多相关文章

  1. windows phone 8.1开发:socket通信聊天

    本例用WPF程序做服务器端,windows phone程序做客户端.我们使用基于UDP协议的Socket通信.更多关于socket信息请查看:http://msdn.microsoft.com/zh- ...

  2. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  3. java socket通信-传输文件图片--传输图片

    ClientTcpSend.java   client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...

  4. java Socket通信使用BufferedReader和BufferedWriter的注意事项

    注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...

  5. Java Socket通信读取相关信息代码

    转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...

  6. Java Socket通信以及可能出现的问题解决

    Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的 ...

  7. Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...

  8. 【Java】Java Socket 通信演示样例

    用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...

  9. Java socket通信

    首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程  等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...

随机推荐

  1. kali linux maltego-情报收集工具

    Maltego是一个交互式数据挖掘工具,它为链接分析呈现有向图.该工具用于在线调查,以发现互联网上各种来源的信息片段之间的关系. 注册Maltego账号,注册地址:https://www.paterv ...

  2. 实验吧简单的SQL注入1,简单的SQL注入

    接上面一篇博客. 实验吧简单的sql注入1 题目连接   http://ctf5.shiyanbar.com/423/web/ 同样,直接输入 1加个但引号,结果下面有返回错误,            ...

  3. vue全局路由守卫beforeEach+token验证+node

    在后端安装jsonwebtoken         npm i jsonwebtoken --save 在 login.js文件中引入      // 引入jwtconst jwt = require ...

  4. Pwn-level2

    题目地址 https://dn.jarvisoj.com/challengefiles/level2.54931449c557d0551c4fc2a10f4778a1 先看一下文件的属性   32位 ...

  5. mysql high severity error 缺少根元素

    high severity error 缺少根元素: C:\Users\cf.yu\AppData\Roaming\Oracle\MySQL Notifier里的settings.config.删除他 ...

  6. 消息中间件(二)MQ使用场景

    一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有ActiveMQ,Rabbit ...

  7. 【AtCoder】AtCoder Grand Contest 035 解题报告

    点此进入比赛 \(A\):XOR Circle(点此看题面) 大致题意: 给你\(n\)个数,问是否能将它们摆成一个环,使得环上每个位置都是其相邻两个位置上值的异或值. 先不考虑\(0\),我们假设环 ...

  8. vue组件通信传值——Vuex

    一.Vuex介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex 也集成到 Vu ...

  9. Unity编辑器扩展学习 转载

    https://www.xuanyusong.com/archives/category/unity/unity3deditor 1 using UnityEngine; public class T ...

  10. k8s 二进制部署详解

    环境说明: 192.168.1.101 -- master01 + etcd01 192.168.1.102 -- etcd02 192.168.1.103 -- etcd03 192.168.1.1 ...