1、创建服务器类

 import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; /**
* 服务器
* @author Administrator
*
*/
public class Server { private int duankou = 9000;//端口号
private ServerSocket server;//声明服务器
private static Socket socket;//声明客户端
private String serName;
public Server(){
try {
init();
} catch (IOException e) {
e.printStackTrace();
}
} /*
* 创建服务器,开始监听
*/
private void init() throws IOException{
server = new ServerSocket(duankou);
System.out.println("------服务器已开启--------");
System.out.println("请输入服务器名字:");
Scanner sc = new Scanner(System.in);
serName = sc.next();
while(true){
socket = server.accept();
hands(socket);
}
} private void hands(Socket socket) {
String key = socket.getInetAddress().getHostAddress()+":"+socket.getPort();
System.out.println("监听到的客户端:"+key);
Thread thread = new Thread(new ThreadSocket(socket));
thread.setName(serName);
thread.start();
} public static void main(String[] args) {
Server server = new Server();
} }

2、创建客户端类

 import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; /**
* 客户端
* @author Administrator
*
*/
public class Client { private int port = 9000;
private String ip="127.0.0.1";
private static Socket socket;
private String cliName;
public Client(){
try {
init();
} catch (Exception e) {
e.printStackTrace();
}
} private void init() throws Exception { System.out.println("-----客户端已开启-----");
System.out.println("请输入客户端名字:");
Scanner sc = new Scanner(System.in);
cliName = sc.next();
socket = new Socket(ip,port);
} public void hands() throws Exception{
Thread threadReader = new Thread(new ThreadReader(socket.getInputStream()),Thread.currentThread().getName());
Thread threadWriter = new Thread(new ThreadWriter(socket.getOutputStream()));
threadWriter.setName(cliName);
threadReader.start();
threadWriter.start(); } public static void main(String[] args) throws Exception {
Client client = new Client();
client.hands();
} }

3、服务器处理socket多线程

 import java.io.IOException;
import java.net.Socket; /**
* 服务器处理Socket线程
* @author Administrator
*
*/
public class ThreadSocket implements Runnable{ private Socket socket; public ThreadSocket(Socket socket){
this.socket = socket;
} @Override
public void run() { try {
Thread threadReader = new Thread(new ThreadReader(socket.getInputStream()));
Thread threadWriter = new Thread(new ThreadWriter(socket.getOutputStream()));
threadReader.start();
threadWriter.start(); } catch (IOException e) {
e.printStackTrace();
} } }

4、读取输入流多线程

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; /**
* 读取输入流线程
* @author Administrator
*
*/
public class ThreadReader implements Runnable{ //private static int HEAD_SIZE=5;//传输最大字节长度
//private static int BUFFER_SIZE=10;//每次读取10个字节
private InputStream is;
public ThreadReader(InputStream is) {
this.is = is;
} @Override
public void run() { try {
while(true){
byte[] b = new byte[1024];
int length = is.read(b);
String message = new String(b,0,length);
System.out.println(Thread.currentThread().getName()+":"+message);
}
} catch (IOException e) {
e.printStackTrace();
} } }

5、发送数据多线程

 import java.io.IOException;
import java.io.OutputStream;
import java.util.Scanner; /**
* 发送数据线程
* @author Administrator
*
*/
public class ThreadWriter implements Runnable{ private OutputStream os;
public ThreadWriter(OutputStream os) {
this.os = os;
} @Override
public void run() { try {
Scanner sc = new Scanner(System.in);
while(true){
System.out.println(Thread.currentThread().getName()+"说:");
String message = sc.next();
os.write(message.getBytes());
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
} } }

Java 多线程Socket编程通讯--实现聊天室代码的更多相关文章

  1. Java利用TCP编程实现简单聊天室

    前言: 本文是我在学习尚学堂JAVA300集第二季网络编程部分仿照视频内容实现而成 具体可以去尚学堂官网观看视频学习 一.实现思路 实现聊天室的最核心部分就是JAVA的TCP网络编程. TCP 传输控 ...

  2. 多线程+socket实现多人聊天室

    最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo: demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消 ...

  3. Express+Socket.IO 实现简易聊天室

    代码地址如下:http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: 首 ...

  4. 使用socket.io打造公共聊天室

    最近的计算机网络课上老师开始讲socket,tcp相关的知识,当时脑袋里就蹦出一个想法,那就是打造一个聊天室.实现方式也挺多的,常见的可以用C++或者Java进行socket编程来构建这么一个聊天室. ...

  5. 网络编程TCP协议-聊天室

    网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...

  6. Java多线程 Socket使用

    点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...

  7. 示例:Socket应用之简易聊天室

    在实际应用中,Server总是在指定的端口上监听是否有Client请求,一旦监听到Client请求,Server就会启动一个线程来响应该请求,而Server本身在启动完线程之后马上又进入监听状态. 示 ...

  8. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

  9. Java多线程Socket在控制台输出的多人聊天室编程

    服务器端代码 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java ...

随机推荐

  1. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  2. Xcode 历史版本

    概述[编辑] Xcode前身是继承自NeXT的Project Builder. The Xcode suite包含有GNU Compiler Collection自由软件(GCC.apple-darw ...

  3. Unity API

    关于 int Mathf.PingPong(t, length); 原理,相当于 #include <iostream> #include <vector> int test( ...

  4. javascript客户端检测技术

    1. Firefox  Gecko是firefox的呈现引擎.当初的Gecko是作为通用Mozilla浏览器一部分开发的,而第一个采用Gecko引擎的浏览器是Netscape6: 我们可以使用用户代理 ...

  5. Apache CXF初级介绍(一)

    Web Service做项目必不可少 一.CXF安装 二.用Ant来创建项目 三.用Maven来创建项目 四.用Eclipse来创建项目 五

  6. IIS服务器运行一段时间后卡死,且无法打开网站(IIS管理无响应,必须重启电脑)

    问题描述: 公司希望使用IIS配合网站显示一些订单跟进的情况并展示出来,所以我们在一台演示的Win7 Pro电脑上安装了IIS,但使用了一段时间后发现每过几天页面就无法正常访问了,而且打开IIS管理器 ...

  7. 【PHP面向对象(OOP)编程入门教程】12.重载新的方法(parent::)

    在学习PHP 这种语言中你会发现, PHP中的方法是不能重载的, 所谓的方法重载就是定义相同的方法名,通过“参数的个数“不同或“参数的类型“不 同,来访问我们的相同方法名的不同方法.但是因为PHP是弱 ...

  8. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  9. 关于sql用<>不等于查询数据不对问题

    平常查询数据 ' 当想要查询 不等于1 的数据的时候,一般会这样查询 ' 此处查询结果没查到所有想要的结果,如果night_flag 列数据为 null时,此行数据是查询不到的. 解决方法一: ' 解 ...

  10. centos-6.5 安装apache

    1.避免端口.程序冲突.使用rpm卸载httpd [root@www /]# rpm -qa httpd #检查httpd的包 [root@www /]# rpm -e httpd --nodeps ...