‘壹’ java程序设计 TCP聊天程序 可以有多个客户端
正好我在做这个,用多线程模型,一个用户开一个线程,主线程负责死循环监听连接,每次一个新连接就为那个用户开一个线程,读客户端发来的信息
‘贰’ java TCP做聊天程序是应该一个聊天窗口一个线程还是一个Socket一个线程
socket通讯是阻塞的,一个聊天就有一个socket,需要一直在哪里阻塞读取数据,所以就一个socket就要用一个线程了。如果用nio的话,通讯是非阻塞的,就不用一个聊天一个线程了。如果聊天人数大的话,建议用nio。现在netty框架就非常不错。
‘叁’ 在java中 如何编写tcp socket聊天室并且可以文件传输
这个用几句话说不明白,Java程序设计(修订本) 297页里有源代码,不过只是聊天儿程序,没有文件传输,可以自己看着代码加文件传输功能.
‘肆’ java基于TCP/IP协议的聊天室服务器如何捕获客户端的非正常退出
可以考虑在客户端出现异常时给服务端发送信息,这个可能不完善,如果出现net之类异常就无法判断。最好的方法是每隔一段时间服务端向客户端发送特定信息,而客户端获取该特定信息后反馈以验证socket的有效性。
‘伍’ 想用java做一个tcp的聊天室,请问一下如何在客户端上获得服务器的客户端列表
一般这种可以通过类似心跳的机制,就是定时向客户端发送报文请求,请求中包含服务器上的用户列表,客户端启用端口监听这个报文,接收到之后解析即可。
‘陆’ 我要一份用java网络编程写的点对点的两人聊天程序(TCP和UDP)
Server端:
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
}catch(Exception e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
socket=server.accept();
}catch(Exception e) {
System.out.println("Error."+e);
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line=sin.readLine();
while(!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:"+line);
System.out.println("Client:"+is.readLine());
line=sin.readLine();
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}
Client端:
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline;
readline=sin.readLine(); //从系统标准输入读入一字符串
while(!readline.equals("bye")){
os.println(readline);
os.flush();
System.out.println("Client:"+readline);
System.out.println("Server:"+is.readLine());
readline=sin.readLine(); //从系统标准输入读入一字符串
}
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}catch(Exception e) {
System.out.println("Error"+e); //出错,则打印出错信息
}
}
}
‘柒’ 用java编写一个基于TCP的聊天室
在网络知道上面,搜索 JAVA SOCKET 聊天
‘捌’ java tcp socket 通信问题
这两个问题都可以通过消息机制来解决,
消息机制就是双方约定的通信语言。
首先:你需要自定义一份双方约定的通信机制,
其次: 对每个连进来的客户按用户ID或IP进行编号存入哈希表,以方便索引用户的Socket通道。 每进来一个客户就 hashtable.put(user.name, socket);
最后:双方都还要有两个缓冲数组(可以是数组Object[],也可以是Vector,Arraylist,Hashtable都可以);
一个叫发送缓冲区,一个叫接收缓冲区。每一个都附带一个管理线程。
向客户端发送消息时,并不是马上就发送,而是将消息推入到发送缓冲区排队,
发送缓冲区的线程会每隔一小片时间后就扫描并 pop出一个可发送的消息。
分析这个消息的源发送者和目的发送者,然后hashtable的索引找到目的发送者的socket通道。并发送.
另一个叫接收缓冲区。 Socket的网络线程不断接收到客户的消息,但不是马上就处理,也不会自己亲自处理,而是压入接收缓冲队列等待缓冲队列来处理,自己休息片段又立马再去接收别的客户发过来的消息。 接收缓冲区有自己的线程,它每sleep一小片刻时间后就扫描队列中有无消息到达,如果有(网络线程刚压进一的),则可以采用监听器模式让监听器处理,如果不想那么复杂也可以自己处理, 会分析消息来源和去向,从去向中分析出将要发送给某人,但自己并不发送,而是直接压入到发送缓冲区(这里就接到前面的发送缓冲区介绍中去了)
最后是消息机制的设计。
我公司的游戏都是由我来设计通信机制,实现三网合一,即手机,PC,电视机顶盒三种客户端同玩一桌麻将游戏
一般java设计的游戏中设计如下:
一. 消息头 二.消息体
消息头设计格式如下: 1. 本消息包长度,以方便解析字节;2. 本消息类型TYPE:如一般消息,游戏消息,大厅消息,聊天消息;3.本消息命令类型COMMAND: 如登陆、个人资料修改、登出、聊天。。。。
消息体设计格式一般根据Type和command不同而有不同。 如聊天消息包含四个字段,String 聊天内容、 User 发送者、 User 接收者、Text文字排版信息
服务端SeverSocket收到这个消息后,压入接收缓冲区, 接收缓冲线程分析其中结构,根据Type和Command的类型实例化出相应消息类, 该消息类能自动将后面的字节流实例化自身的字段。从而得到接收方和发送方, 得到接收方后再将消息封装好压入到发送队列
这个结构除完全适合聊天系统以外,以后要加入新内容将会非常容易!
如果有什么疑问欢迎call我, 我不负责写代码,但可以指点你。 另外,我的回答记录中有用nio设计的聊天室BBS代码。也是帮一个学生做的。你可以看看
‘玖’ 我用java编了一个tcp一对一聊天程序,只能发送文本,不能发图片,求指明路,新手,多多包涵(^_^)∠※
首先将文件图片读到内存中,编下码,比如base64什么的,然后定义一个消息头,告诉对方你发送的是什么内容,然后开始发送,对方接到消息后,根据消息头的内容处理消息
比如
-- 自定协议中,第一行信息为消息头,00代表文本,接收方直接显示,01代表图像,就解码,输出图像,02...;这个就随你创意了
00
BalabalaBalabala...
方案二,先告诉对方你要发图片,等待对方确认后,直接将图像的byte[]发过去