一个简单是Socket聊天小程序,读写操作在不同的线程中。服务器端采用线程池。

1、Server

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Server
{
private static final ExecutorService threadWorkers = Executors
.newCachedThreadPool(); private void start() throws IOException
{
ServerSocket server = new ServerSocket(8899);
while (true)
{
Socket socket = server.accept();
threadWorkers.execute(new ThreadWorker(socket));
} } public static void main(String[] args) throws IOException
{
Server server = new Server();
server.start();
}
}

2、Client

import java.net.Socket;

public class Client
{
public static void main(String[] args) throws Exception
{
Socket socket = new Socket("127.0.0.1", 8899);
new Thread(new InputReceiverAndSender(System.in,socket.getOutputStream())).start();
new Thread(new SocketReader("Server", socket.getInputStream())).start();
}
}

3、InputReceiverAndSender

import java.io.*;

public class InputReceiverAndSender implements Runnable
{
private BufferedReader receiver; private BufferedWriter sender; private InputStream input; static int i = 0; String name; public InputReceiverAndSender(InputStream input, OutputStream output)
{
super();
name = ""+(i++);
this.input = input;
this.receiver = new BufferedReader(new InputStreamReader(input));
this.sender = new BufferedWriter(new OutputStreamWriter(output));
} public void run()
{
String message = null;
try
{
try
{
do
{
synchronized (input)
{
message = receiver.readLine();
}
System.out.println(name+":"+message);
sender.write(message);
// 写入行结束标志,如果省略这句,另一端是无法读入的
sender.newLine();
sender.flush();
}
while (message != null);
}
finally
{
receiver.close();
sender.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

4、SocketReader

import java.io.*;

public class SocketReader implements Runnable
{
private BufferedReader receiver;
private String name; public SocketReader(String name, InputStream input)
{
super();
this.name = name;
this.receiver = new BufferedReader(new InputStreamReader(input));
} public void run()
{
try
{
try
{
String message = null;
while ((message = receiver.readLine()) != null)
{
System.out.println(name + ":" + message);
}
}
finally
{
receiver.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

5、ThreadWorker

import java.io.IOException;
import java.net.Socket; public class ThreadWorker implements Runnable
{ private static int id = 1; private Socket socket; public ThreadWorker(Socket socket)
{
this.socket = socket;
} @Override
public void run()
{
System.out.println("connected...");
// 输入及发送线程
try
{
new Thread(new InputReceiverAndSender(System.in,
socket.getOutputStream())).start();
// 读线程
new Thread(new SocketReader("Agent" + (id++),
socket.getInputStream())).start();
}
catch (IOException e)
{
e.printStackTrace();
} }
}

[Socket]Socket聊天小程序的更多相关文章

  1. netty使用以及聊天小程序

    <从零开始搭建游戏服务器>Netty导入创建Socket服务器 Netty入门教程 Netty 聊天小程序

  2. Netty学习——基于netty实现简单的客户端聊天小程序

    Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...

  3. Netty 聊天小程序

    这节讲解基于 Netty 快速实现一个聊天小程序. 一.服务端 1. SimpleChatServerHandler(处理器类) 该类主要实现了接收来自客户端的消息并转发给其他客户端. /** * 服 ...

  4. 类似微信聊天小程序-网易云信,IM DEMO小程序版本

    类似微信聊天小程序-网易云信,IM DEMO小程序版本 代码地址: https://github.com/netease-im/NIM_Web_Weapp_Demo 云信IM DEMO 小程序版本 ( ...

  5. 答题小程序开发之socket编程 微信小程序答题 直播答题开发 直播弹幕使用web socket编程

    最近有一个项目很火,那就是直播答题的,接到公司的这个任务,开发直播答题的聊天室功能.在线的人相互聊天.之前做过类似的,当时都是使用的ajax轮询的,这种非常的耗费服务器.所以这次就开始使用socket ...

  6. socket 收发报文小程序

    需要注意,由于是从文件读取,而WINDOWS自带的文本文档程序,亲测对于UTF-8文件会不可见地在文件头多出3个字节.另外回车换行也是不可见字节,需要考虑到. package com.test.com ...

  7. java socket编程--聊天小案例

    很久以前写过socket聊天室,都快忘完了,心血来潮又重新写一遍. 服务器端: package com.fancy; import java.io.BufferedReader; import jav ...

  8. 基于JAVA网络编程的聊天小程序

    package com.neusoft.edu.socket; import java.io.BufferedReader; import java.io.IOException; import ja ...

  9. Python实现群聊天小程序代码

    群聊服务端 服务端Server.py代码如下: # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2018/5/18 16:05 # @D ...

随机推荐

  1. 使用过AsyncTask、EventBus、Volley以及Retrofit,必须好好了解handler运行机制

    我们都知道在UI线程中不能进行耗时操作,例如数据读写.网络请求.Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadExceptio ...

  2. macos 下安装brew

    1.终端执行 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...

  3. [20171113]修改表结构删除列相关问题.txt

    [20171113]修改表结构删除列相关问题.txt --//维护表结构删除字段一般都是先ALTER TABLE <table_name> SET UNUSED (<column_n ...

  4. centos7系统下hostname解析

    hostnamectl 是在 centos7以上版本 中新增加的命令,它是用来修改主机名称的,centos7 修改主机名称会比以往容易许多. 首先了解下这个命令 # hostnamectl -h -h ...

  5. Windows 下配置 Apache 支持 https

    1.打开cmd ,输入  F: // 切换到Apache安装路径,我的Apache安装目录在 F盘 2.cd F:\Apache\bin 3.set "openssl_conf = F:\A ...

  6. Java-栈的学习(字符串的反转)

    StackX类 public class StackX{ private int maxSize; private char StackArray[]; private int top; public ...

  7. el-table表格标题换行

    在做一些管理后台的项目中,表格时最常见的,当有时数据字段多时往往会用滚动条,但从用户体验角度讲,肯定需要多展示信息,那么可能需要一个单元格放多个字段,这时候表头就需要换行. 具体实现如下: // 注意 ...

  8. pandas的to_csv()使用方法

    1.首先查询当前的工作路径: import osos.getcwd() #获取当前工作路径2.to_csv()是DataFrame类的方法,read_csv()是pandas的方法dt.to_csv( ...

  9. Qt5.7 + VS2015 环境搭建

    http://blog.csdn.net/liang19890820/article/details/53931813#安装插件 配置 Qt 5.7 选择:Qt VS Tools -> Qt O ...

  10. oracle 查询 归档日志最大值和平均值

    select max(ss.size_GB), avg(ss.size_GB)  from (select s.*, rownum rn2          from (select a.*      ...