一个简单是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. Android系统启动流程 总结

    整体流程大致如下:   Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程.从系统角度看,Android的启动程序可分为:   1.bootload ...

  2. Anaconda3 错误集合

    1. An error ocurred while starting the kernel 答:个人猜测有可能是配置文件出现问题,于是采用如下解决方法: 在终端中输入spyder --reset,重置 ...

  3. ORACLE11g下如何利用SQL DEVELOPER连接上数据库

    最近在学习数据库的相关内容,在sqlplus敲了几天命令行窗口后,想尝试一下用sql developer 连接上数据库但一直没有实现.在网上查询了相关资料后现在终于弄好了,就来写下此篇博文与大家分享! ...

  4. python pip 使用时错误: Patal error in launcher:Unable to create process using '"'

    当前我的电脑配置是64位, 装有python2.7 和python 3.6 两个版本 在使用pip install mysqlclient 的时候,出现了  Patal error in launch ...

  5. Sublime Text 3 注册码激活码被移除的解决办法

    新版的sublime text3中加入了验证功能,之前成功注册的也被移除了,在网上搜索的验证码要么已经失效要么已经被封,少数几个正常的注册输入进去注册成功后几分钟之内这个注册码就会被莫名其妙的被移除. ...

  6. Java并发编程(多线程)中的相关概念

    众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试中必问的题,一个好的Java程序员是必须对并发编程这块有所了解的. 并发必须知道的概念 在深入学习并发编程之前,我们需要了解几个基本 ...

  7. java死锁详解

    进程死锁及解决办法: 一:死锁的概念:    死锁是进程死锁的简称    什么是死锁:    死锁是指多个进程循环等待他方占有的资源而无限的僵持下去的局面.很显然,没有外力作用,那么死锁涉及到的各个进 ...

  8. Android实践--apk反编译

    版权声明:本文为博主原创文章.转载请注明出处. https://blog.csdn.net/ysjian_pingcx/article/details/25468867 Android apk反编译一 ...

  9. oracle 11gR2 ASM添加和删除磁盘

    一.环境 oracle 11gR2 RAC + Oracle Linux Server release 5.9 二.实施 备注:安全起见,操作之前停数据库实例.ASM实例 1.节点1.2磁盘信息 -- ...

  10. D - C Looooops POJ - 2115 欧几里德拓展

    题意:就是看看for(; ;)多久停止. 最让我蛋疼的是1L和1LL的区别!让我足足wa了12发! 1L 是long类型的, 1LL为long long类型的! 思路: 这就是欧几里德扩展的标准式子了 ...