一个简单是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. Kotlin入门(10)七十二变的输入参数

    上一篇文章介绍了Kotlin对函数的基本用法,包括函数的定义.输入参数的声明.输出参数的声明等等,这些足够对付简单的场合了.当然了,倘若一门新语言仅仅满足于这些雕虫小技,那也实在没什么前途.既然Kot ...

  2. 自定义合并列:el-table

    objectSpanMethod({ row, column, rowIndex, columnIndex }) {//合并规则 //当前行row.当前列column.当前行号rowIndex.当前列 ...

  3. SQL Server ->> DAC(Dedicated Administrator Connection)专用管理员连接

    专用管理员连接是一种特殊的SQL Server服务器诊断性质的连接,用于在正常或者说标准连接形式无法连接SQL Server服务器的情况下连接到服务器进行服务器性能或者错误诊断.DAC同样支持安全加密 ...

  4. postgresql-JSON使用

    json,jsonb区别 json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等.而jsonb是解析输入后保存的二进制,它 ...

  5. Matplotlib:可视化颜色命名分类和映射颜色分类

    Matplotlib中支持的所有颜色分类 映射颜色分类

  6. JDBC学习笔记之JDBC简介

    1. 引言 JDBC API是一种Java API,可以访问任何类型的表格数据,特别是存储在关系数据库中的数据. JDBC可以帮助我们编写下列三种编程活动的java应用程序: 1.连接到数据源,如数据 ...

  7. SpringMVC中与Spring相关的@注解

    一.Spring的常用组件类注解 @Component    被该注解所修饰的类是一个普通的spring bean类,该注解可以替代@Controller.@Service.@Repository.在 ...

  8. SQL Server2008 18456错误

    1.以windows验证模式进入数据库管理器.   第二步:右击sa,选择属性:   在常规选项卡中,重新填写密码和确认密码(改成个好记的).把强制实施密码策略去掉.   第三步:点击状态选项卡:勾选 ...

  9. 添加Nginx为系统服务(设置开机启动)

    在本节中,我们将创建一个脚本,将Nginx守护进程转换为实际的系统服务. 这有两个作用:守护程序可以使用标准命令控制,更重要的是,它可以在系统启动时自动启动,并在系统关闭时停止. System V s ...

  10. iText5报表_页眉与页脚

    1.概述       iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作.PdfPageEventHelper ...