- 浏览: 430224 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xiang37:
wwwang89 写道这位大哥,你好!很感谢你分享的文章,写的 ...
iPhone调用java的webService -
wwwang89:
这位大哥,你好!很感谢你分享的文章,写的很好,适合我们新手学习 ...
iPhone调用java的webService -
QQ371496669:
能否具体讲解一下为什么StringBuilder的长度会不一样 ...
StringBuilder与StringBuffer相比为什么不是线程安全的 -
Sky_257:
请问 能用abap查询sap服务器的配置、会话、队列、spo ...
使用JCo远程调用SAP系统函数 -
xiang37:
vebasan 写道此句代码的单词有错(标红色的):prop. ...
最简单的EJB示例
在学习了,多线程和socket之后;就想实现这个功能;但是一直没有花时间去写。可能我学得比较杂吧。
本程序虽然不是很完善,但是基本要求达到了。
功能:实现多个人同时聊天。类似于群聊天室
package com.xiva.bean; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class SocketServer { public static List<Socket> socketList = new ArrayList<Socket>(); public static int number = 0; public static void main(String[] args) { try{ //绑定服务端在8080端口 ServerSocket server = new ServerSocket(8080); Socket socket; int count = 0; while (true) { //监听客户端程序 socket = server.accept(); count = count + 1; System.out.println(socket.getInetAddress().getHostAddress()); //一个客户端连接后启动一个线程进行监听客户端消息 ReadThread readThread = new ReadThread(socket); readThread.start(); socketList.add(socket); } } catch(IOException e){ e.printStackTrace(); } } } class ThreadSocketServer extends Thread { Socket server; public ThreadSocketServer(){ } public ThreadSocketServer(Socket s) { this.server = s; } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); PrintWriter pw = new PrintWriter(server.getOutputStream()); //循环发送信息给客户端 while (true) { String s = br.readLine(); pw.println(s); pw.flush(); System.out.println("Server:" + s); } } catch (IOException e) { e.printStackTrace(); } } } class ReadThread extends Thread { private Socket socket; public ReadThread(Socket socket){ this.socket = socket; } public void run() { try { BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); String read=new String(); //循环接受客户端信息 while(true) { read=br.readLine(); System.out.println(socket.getInetAddress().getHostAddress() +"client说:"+read); ArrayList<Socket> socketList = SocketServer.socketList; for(int i = 0; i < socketList.size(); i ++){ Socket socket = socketList.get(i); PrintWriter pw = new PrintWriter(socket.getOutputStream()); pw.println(read); pw.flush(); } if(read.equals("bye")) { break; } } br.close(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
不用说了上面是socket的server端。
标题中提到了,全局静态变量;就是上面程序中的socketList。用来存储每一个连接到server端的socket.
在read线程中,同时向所有的client端发送信息。
其中类ThreadSocketServer ,可以启动用来和用户一对一的对话。
package com.xiva.bean; import java.io.*; import java.net.*; public class TalkClient { public static void main(String args[]) { try{ Socket socket=new Socket("192.168.0.64",8080); ReadString read = new ReadString(socket); read.start(); BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); PrintWriter os=new PrintWriter(socket.getOutputStream()); String readline=sin.readLine(); while(!readline.equals("bye")){ os.println(readline); os.flush(); System.out.println("Client:"+readline); readline=sin.readLine(); } os.close(); socket.close(); }catch(Exception e) { System.out.println("Error"+e); } } } class ReadString extends Thread { private Socket socket; public ReadString(Socket socket){ this.socket = socket; } public void run() { try { BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //循环接受服务端信息 while(true) { String read = is.readLine(); System.out.println("Server:"+read); if(read.equals("bye")) { break; } } is.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
客户端程序,在于启动一个线程监视server端传过来的message,同时可以不断的发送信息给server端。
这样多人聊天室,便实现了。
扩展方向,可以在list中绑定其他信息,比如userInfo。当客户端连接时,发送给客户端有哪些其它客户在线。同样绑定了userInfo后,这样就可以for循环时,判断线程中和那个用户绑定了,也不需要得到线程里面的具体信息了。这样一对一的聊天也很容易就实现了,这些只要有了这个主干下面的程序就好延伸了。
还有需要注意的就是线程存在的时间,我们可能需要写一个定时器,不断唤醒程序,以及让其睡眠。
今后实现了,源码再和大家分享;不过现在网上也有很多开源的这种代码,但自己写出来感觉还是不同。
评论
2 楼
lockemn
2011-10-31
客户端接受线程有问题,当输入"bye"退出聊天室,socket连接关闭,假如此时接受线程刚好在执行is.readLine(),而is输入流中的socket已关闭,则会抛出java.net.SocketException: Socket closed.
1 楼
dopic
2011-04-15
发表评论
-
Tesseract-OCR的简单使用与训练
2018-06-06 19:45 2791参照: https://www.cnblogs.com/c ... -
JNA与动态链接库交互之使用结构体与结构体数组
2016-10-13 17:54 2228Java调用C/C++动态链接库函数,当传 ... -
ElasticSearch1.7.3 报错Root type mapping not empty after parsing!
2015-12-16 23:02 1372熟悉Lucene也比较久了 ... -
TopN问题的算法实现
2015-05-11 00:15 1544TopN指的是从已经存在的数组中,找出最大(或最小)的前n ... -
NIO之Socket通信
2015-04-11 15:18 0Server端 package com.xiva.nio; ... -
阻塞与非阻塞通讯
2015-03-14 13:18 764在一个阻塞C/S系统中,服务器要为每一个客户连接开启一个线程阻 ... -
[续]Java调用DLL视频解帧,并保存第一关键帧到JPG格式文件
2014-05-15 00:59 1450本篇文章的前一篇是采用FFmpeg解帧,并保持到JPG格式 ... -
Jconsole连接之JVM设置
2014-05-13 03:06 873Jconsole连接之JVM设置 -Xmx256m ... -
Lucene4.x SmartChineseAnalyzer添加扩展词
2013-11-30 23:21 1661之前有一点研究,现在奉上比较完整的代码,可根据项目 ... -
Java ORC
2013-05-22 14:09 0http://blog.csdn.net/lonelyli ... -
OSCache的对action响应的配置
2013-05-08 23:13 1049对action响应的配置其实也不是很特别,这里主要提到的是 ... -
Java PING一个IP地址 isReachable
2013-05-08 17:38 1961Java1.5可以替换很古老Runtime的PING方法 ... -
Java后台返回easyUI的comboxTree数据
2013-05-04 10:08 1708easyUI的实现,其中包括一次加载完毕和动态树: ... -
利用JDBC生成数据库表对应的Class
2013-05-01 19:26 1186简单的实现了Hibernate工具自动生成Class文件的 ... -
HttpClient4示例
2013-04-30 01:27 2148之前做过一个3版本HttpClient简单示例的示例,最 ... -
http client
2013-04-24 17:57 0import java.io.IOException; i ... -
Java6新特性之动态生成Class,并加载
2013-04-24 23:56 1065利用JavaCompiler对文件进行动态编译,JDK1. ... -
利用JNA对文件进行监听之观察者模式
2013-04-25 00:01 1510JNA为第三方的JNI的一个实现包。里面实现了很多wind ... -
Lucene4全文索引示例
2013-04-30 02:20 1566Lucene4.2.1示例,之前也做过3.6的示例。3.6 ... -
改进后的归并排序,对大文件归并排序
2013-04-25 00:05 1143针对大文件,一次无法全部读入内存,可以采用将内容保存到文件 ...
相关推荐
然而,多线程编程也带来了一些挑战,尤其是当多个线程同时访问共享资源,如全局变量时,可能会出现竞态条件(Race Condition)和其他并发问题。本文将深入探讨标题“多线程同时操作全局变量的出错演示”所涉及的知识...
NULL 博文链接:https://toknowme.iteye.com/blog/2212529
标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先...
下面我们将深入探讨如何利用全局变量进行多线程通信以及涉及的相关知识点。 首先,我们要理解什么是全局变量。全局变量是在函数外部定义的变量,它在整个程序中都是可见的,可以在程序的任何地方被访问。这种特性...
【标题】基于多线程和SOCKET聊天室 在IT领域,网络通信是不可或缺的一部分,尤其是在构建实时交互系统时,如聊天室。本项目“基于多线程和SOCKET聊天室”就是一个很好的实例,它利用C#语言在Windows Forms(WINFORM...
在C#编程环境中,Socket和多线程技术的结合被广泛应用于网络通信,尤其是在构建聊天室这类实时交互的应用中。本项目"**C#Socket 多线程聊天室A**"是一个很好的学习资源,它展示了如何利用C#的Socket类进行网络通信...
本文将深入探讨如何使用C#语言实现一个基于TCP/IP协议的多线程Socket聊天室。这个聊天室功能允许局域网内的多台计算机进行实时信息交互,虽然没有在广域网环境下测试,但在局域网内能有效工作。 首先,我们要理解...
本项目“C#多线程socket聊天室A”就是一个很好的实例,它展示了如何利用C#的Socket类和多线程技术构建一个聊天服务器。 首先,让我们深入理解“Socket”。Socket是网络通信的基本单元,它是进程间通过网络进行通信...
在Linux系统中,C语言与TCP Socket编程相结合可以创建出多线程的简易聊天室。这个项目主要涉及以下几个核心知识点: 1. **TCP Socket编程**: - TCP(Transmission Control Protocol)是一种面向连接的、可靠的...
在Java编程领域,多线程和Socket通信是两个重要的概念,...总之,这个基于Java的多线程Socket聊天室源代码是学习网络编程和并发处理的好例子,它展示了如何使用Java的基本工具来创建一个基本但功能完整的网络应用程序。
C++语言编写,SOCKET套接字通信,分服务器和客户端,多线程模型,Win32控制台。 首先聊天室分为服务端和客户端,通过TCP连接通信。运行顺序为: 1.首先打开服务服; 2.打开客户端,用户输入名字,连接到服务端后...
本篇文章将深入探讨如何在C#中利用多线程和socket技术创建一个聊天室实例。 首先,理解`socket`的概念至关重要。Socket是网络编程中的基本接口,它允许应用程序通过网络发送和接收数据。在C#中,我们可以使用System...
在Java编程领域,Socket通信是实现网络应用间交互的基础,特别是在构建多用户聊天室时,多线程技术显得尤为重要。本项目"java socket多线程多人聊天室"旨在利用Java的Socket API创建一个支持多个客户端同时连接的...
Socket编程和多线程技术是计算机网络编程中的两个重要概念,尤其在开发实时通信应用,如聊天室时,它们起着关键作用。本项目“Socket和多线程的聊天室”是一个基于控制台的简单聊天应用程序,允许用户通过命令行进行...
本文将深入探讨如何使用结构体(struct)和全局变量在多线程间传递参数,特别是在Linux环境下使用`make`进行编译的情况。 首先,理解全局变量。全局变量是在函数外部定义的变量,可以在程序的任何地方被访问,只要...
在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...
本项目"**C# Socket多线程聊天室**"就是一个典型的示例,它展示了如何利用C#的Socket类以及多线程技术创建一个简单的聊天应用。以下是关于这个项目的详细知识点: 1. **Socket编程**: Socket是网络通信中的基本组件...
在MFC(Microsoft Foundation Classes)框架中,全局变量和函数的使用与标准C++有所不同,因为MFC工程通常由多个文件组成,需要一种方法来在这些文件之间共享数据和功能。这里将介绍两种在MFC工程中定义全局变量和...