⑴ 为java聊天室代码加详细注释,并说明设计思路。好的加100分。
import java.io.*;
import java.net.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;//引入包。
public class ChatClient {
public static void main(String[] args) {
ChatClient cc = new ChatClient();
cc.receive();
}
JTextField jtf; // 文本条
JTextArea jta; //文本域。
Socket s; //客户端
PrintWriter out; //输出流
BufferedReader in; //输入流
public ChatClient() {
JFrame frame = new JFrame("ChatClient");//窗口
frame.setSize(400, 300); //大小
jta = new JTextArea(); //文本域
jta.setEditable(false); //不可编辑
jtf = new JTextField();//文件条
jtf.addActionListener(new ActionListener() { //添加监听。
public void actionPerformed(ActionEvent arg0) {
send(); //调用send()方法
}
});
frame.getContentPane().add(new JScrollPane(jta)); //添加滚动条
frame.getContentPane().add(jtf, "South"); //添加文本条
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口。
frame.setVisible(true); //可显示的。
try {
s = new Socket("127.0.0.1", 9000); //连接服务端 socket("主机名",端口号);
in = new BufferedReader(new InputStreamReader(s.getInputStream())); //建立输入流
out = new PrintWriter(s.getOutputStream());//输出流
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void receive() { //接受服务端发来别的客户端的信息。
while (true) {
try {
String text = in.readLine(); //读一行
this.jta.append(text + "\n"); //jta 添加上读入的。
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
}
public void send() { //发送消息
String text = this.jtf.getText(); //得到你输入的消息
this.jtf.setText(""); //在文本域中显示你输入的消息。
out.println(text); //打印出。
out.flush(); //清空
}
}
Server端
import java.net.*;
import java.io.*;
import java.util.*;//引入包
public class ChatServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(9000); //建立服务端,端口号为9000
List list = new ArrayList(); //创建个List集合。
while (true) {
Socket s = ss.accept(); //等待客户端的请求。
list.add(s); //把每一个client都add到集合中去。
Thread t = new ServerThread(s, list); //线程。
t.start(); //启动。
}
}
}
class ServerThread extends Thread {
Socket s;
List list;
BufferedReader in;
PrintWriter out;
public ServerThread(Socket s, List list) { //构造。传入socket和list。
this.s = s;
this.list = list;
try {
in = new BufferedReader(new InputStreamReader(s.getInputStream())); //输入流
out = new PrintWriter(s.getOutputStream()); //输出流
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() { //必须实现其run()方法。
while (true) {
try {
String str = in.readLine(); //得到client端的message。
if (str == null) //如果没有消息就返回。
return;
Iterator it = list.iterator(); //遍历list。
while (it.hasNext()) { //如果list有下一个
Socket socket = (Socket) (it.next()); //因为list中都是存的socket
PrintWriter o = new PrintWriter(socket.getOutputStream()); //输出流
o.println(str); //输出
o.flush(); //清空
}
} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
return;
}
}
}
}
⑵ 对下面的java代码进行注释,关键语句给点中文的解释,部分函数的功能,这是个聊天室程序
package cn.text;
public class hah {
@Override
public String execute() throws Exception {
//转换字符集
roomName = new String(roomName.getBytes("ISO-8859-1"),"utf-8");
System.out.println(roomName);
//转换字符集
userName = new String(userName.getBytes("ISO-8859-1"),"utf-8");
System.out.println(userName);
//判断房间是否为空
if(roomName==null){
System.out.println("你没有选择房间");
//设置返回提示的信息,在登录页面接受
setTip("你没有选择房间");
return "error";
}//判断用户是否为空
if(userName==null){
System.out.println("你没有登陆");
setTip("你没有登陆");
return "error";
}
//获取session
Map session = ActionContext.getContext().getSession();
//将存在的用户放入session
session.put("roomName", roomName);
//查看这个用户当前是否在线
UserList test=userListService.getUserListsByUserName(userName);//即为在线用户(半个小时内的发信息的用户,由后台数据库维护)
if(test==null){//不是在线用户
System.out.println("欢迎您,"+userName+"聊天室名称为:"+roomName);
//设置提示信息
setTip("欢迎您,"+userName+",聊天室名称为:"+roomName);
//将用户名 聊天室 当前聊天内容 当前聊天时间 放入 userListService实体类集合中
userListService.saveUserList(new UserList(roomName,userName,new java.sql.Timestamp(System.currentTimeMillis()),new java.sql.Timestamp(System.currentTimeMillis())));
//将时间放入session中
session.put("loginDate", new java.sql.Timestamp(System.currentTimeMillis()));
}else{
if(roomName.equals(test.getRoomName())){
setTip("您已经是该房间的在线用户,可以继续聊天!");
}else{
if(test.getRoomName()!=null&&!test.getRoomName().equals("")){
setTip("您进入了新的房间"+roomName+",上次进入的房间名称为"+test.getRoomName());
}else{
setTip("您进入了新的房间"+roomName);
}
test.setRoomName(roomName);
//设置登录时间
test.setLoginDate(new java.sql.Timestamp(System.currentTimeMillis()));
//设置离开时间
test.setMessDate(new java.sql.Timestamp(System.currentTimeMillis()));
//把这些信息放入集合中
userListService.updateUserList(test);
}
session.put("loginDate", test.getLoginDate());
}
//获得当前该聊天室所有在线用户
onlineUser=userListService.findOnlineUserLists(roomName);
//将在线用户放入session
session.put("onlineUser", onlineUser);
return "success";
}
/**
* 下面这些代码 是用工具生成的 ,你应该知道
* @return
*/
//UserListService 的get set 方法
public UserListService getUserListService() {
return userListService;
}
public void setUserListService(UserListService userListService) {
this.userListService = userListService;
}
//roomName 的get set 方法
public String getRoomName() {
return roomName;
}
public void setRoomName(String roomName) {
this.roomName = roomName;
}
//userName 的get set 方法
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//onlineUser 的get set 方法
public List<String> getOnlineUser() {
return onlineUser;
}
public void setOnlineUser(List<String> onlineUser) {
this.onlineUser = onlineUser;
}
//messService 的get set 方法
public MessService getMessService() {
return messService;
}
public void setMessService(MessService messService) {
this.messService = messService;
}
//messStr 的get set 方法
public String getMessStr() {
return messStr;
}
public void setMessStr(String messStr) {
this.messStr = messStr;
}
}
⑶ 求java网络聊天室(B/S模式)程序代码
共四个java文件,源代码如下:
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.io.*;
import java.util.Hashtable;
public class ChatArea extends Panel implements ActionListener,Runnable
{
Socket socket=null;
DataInputStream in=null;
DataOutputStream out=null;
Thread threadMessage=null;
TextArea 谈话显示区,私聊显示区=null;
TextField 送出信息=null;
Button 确定,刷新谈话区,刷新私聊区;
Label 提示条=null;
String name=null;
Hashtable listTable;
List listComponent=null;
Choice privateChatList;
int width,height;
public ChatArea(String name,Hashtable listTable,int width,int height)
{
setLayout(null);
setBackground(Color.orange);
this.width=width;
this.height=height;
setSize(width,height);
this.listTable=listTable;
this.name=name;
threadMessage=new Thread(this);
谈话显示区=new TextArea(10,10);
私聊显示区=new TextArea(10,10);
确定=new Button("送出信息到:");
刷新谈话区=new Button("刷新谈话区");
刷新私聊区=new Button("刷新私聊区");
提示条=new Label("双击聊天者可私聊",Label.CENTER);
送出信息=new TextField(28);
确定.addActionListener(this);
送出信息.addActionListener(this);
刷新谈话区.addActionListener(this);
刷新私聊区.addActionListener(this);
listComponent=new List();
listComponent.addActionListener(this);
privateChatList=new Choice();
privateChatList.add("大家(*)");
privateChatList.select(0);
add(谈话显示区);
谈话显示区.setBounds(10,10,(width-120)/2,(height-120));
add(私聊显示区);
私聊显示区.setBounds(10+(width-120)/2,10,(width-120)/2,(height-120));
add(listComponent);
listComponent.setBounds(10+(width-120),10,100,(height-160));
add(提示条);
提示条.setBounds(10+(width-120),10+(height-160),110,40);
Panel pSouth=new Panel();
pSouth.add(送出信息);
pSouth.add(确定);
pSouth.add(privateChatList);
pSouth.add(刷新谈话区);
pSouth.add(刷新私聊区);
add(pSouth);
pSouth.setBounds(10,20+(height-120),width-20,60);
}
public void setName(String s)
{
name=s;
}
public void setSocketConnection(Socket socket,DataInputStream in,DataOutputStream out)
{
this.socket=socket;
this.in=in;
this.out=out;
try
{
threadMessage.start();
}
catch(Exception e)
{
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==确定||e.getSource()==送出信息)
{
String message="";
String people=privateChatList.getSelectedItem();
people=people.substring(0,people.indexOf("("));
message=送出信息.getText();
if(message.length()>0)
{
try {
if(people.equals("大家"))
{
out.writeUTF("公共聊天内容:"+name+"说:"+message);
}
else
{
out.writeUTF("私人聊天内容:"+name+"悄悄地说:"+message+"#"+people);
}
}
catch(IOException event)
{
}
}
}
else if(e.getSource()==listComponent)
{
privateChatList.insert(listComponent.getSelectedItem(),0);
privateChatList.repaint();
}
else if(e.getSource()==刷新谈话区)
{
谈话显示区.setText(null);
}
else if(e.getSource()==刷新私聊区)
{
私聊显示区.setText(null);
}
}
public void run()
{
while(true)
{
String s=null;
try
{
s=in.readUTF();
if(s.startsWith("聊天内容:"))
{
String content=s.substring(s.indexOf(":")+1);
谈话显示区.append("\n"+content);
}
if(s.startsWith("私人聊天内容:"))
{
String content=s.substring(s.indexOf(":")+1);
私聊显示区.append("\n"+content);
}
else if(s.startsWith("聊天者:"))
{
String people=s.substring(s.indexOf(":")+1,s.indexOf("性别"));
String sex=s.substring(s.indexOf("性别")+2);
listTable.put(people,people+"("+sex+")");
listComponent.add((String)listTable.get(people));
listComponent.repaint();
}
else if(s.startsWith("用户离线:"))
{
String awayPeopleName=s.substring(s.indexOf(":")+1);
listComponent.remove((String)listTable.get(awayPeopleName));
listComponent.repaint();
谈话显示区.append("\n"+(String)listTable.get(awayPeopleName)+"离线");
listTable.remove(awayPeopleName);
}
Thread.sleep(5);
}
catch(IOException e)
{
listComponent.removeAll();
listComponent.repaint();
listTable.clear();
谈话显示区.setText("和服务器的连接已中断\n必须刷新浏览器才能再次聊天");
break;
}
catch(InterruptedException e)
{
}
}
}
}
ChatServer.java
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer
{
public static void main(String args[])
{
ServerSocket server=null;
Socket you=null;
Hashtable peopleList;
peopleList=new Hashtable();
while(true)
{
try
{
server=new ServerSocket(6666);
}
catch(IOException e1)
{
System.out.println("正在监听");
}
try {
you=server.accept();
InetAddress address=you.getInetAddress();
System.out.println("用户的IP:"+address);
}
catch (IOException e)
{
}
if(you!=null)
{
Server_thread peopleThread=new Server_thread(you,peopleList);
peopleThread.start();
}
else {
continue;
}
}
}
}
class Server_thread extends Thread
{
String name=null,sex=null;
Socket socket=null;
File file=null;
DataOutputStream out=null;
DataInputStream in=null;
Hashtable peopleList=null;
Server_thread(Socket t,Hashtable list)
{
peopleList=list;
socket=t;
try {
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch (IOException e)
{
}
}
public void run()
{
while(true)
{ String s=null;
try
{
s=in.readUTF();
if(s.startsWith("姓名:"))
{
name=s.substring(s.indexOf(":")+1,s.indexOf("性别"));
sex=s.substring(s.lastIndexOf(":")+1);
boolean boo=peopleList.containsKey(name);
if(boo==false)
{
peopleList.put(name,this);
out.writeUTF("可以聊天:");
Enumeration enum=peopleList.elements();
while(enum.hasMoreElements())
{
Server_thread th=(Server_thread)enum.nextElement();
th.out.writeUTF("聊天者:"+name+"性别"+sex);
if(th!=this)
{
out.writeUTF("聊天者:"+th.name+"性别"+th.sex);
}
}
}
else
{
out.writeUTF("不可以聊天:");
}
}
else if(s.startsWith("公共聊天内容:"))
{
String message=s.substring(s.indexOf(":")+1);
Enumeration enum=peopleList.elements();
while(enum.hasMoreElements())
{
((Server_thread)enum.nextElement()).out.writeUTF("聊天内容:"+message);
}
}
else if(s.startsWith("用户离开:"))
{
Enumeration enum=peopleList.elements();
while(enum.hasMoreElements())
{ try
{
Server_thread th=(Server_thread)enum.nextElement();
if(th!=this&&th.isAlive())
{
th.out.writeUTF("用户离线:"+name);
}
}
catch(IOException eee)
{
}
}
peopleList.remove(name);
socket.close();
System.out.println(name+"用户离开了");
break;
}
else if(s.startsWith("私人聊天内容:"))
{
String 悄悄话=s.substring(s.indexOf(":")+1,s.indexOf("#"));
String toPeople=s.substring(s.indexOf("#")+1);
Server_thread toThread=(Server_thread)peopleList.get(toPeople);
if(toThread!=null)
{
toThread.out.writeUTF("私人聊天内容:"+悄悄话);
}
else
{
out.writeUTF("私人聊天内容:"+toPeople+"已经离线");
}
}
}
catch(IOException ee)
{
Enumeration enum=peopleList.elements();
while(enum.hasMoreElements())
{ try
{
Server_thread th=(Server_thread)enum.nextElement();
if(th!=this&&th.isAlive())
{
th.out.writeUTF("用户离线:"+name);
}
}
catch(IOException eee)
{
}
}
peopleList.remove(name);
try
{
socket.close();
}
catch(IOException eee)
{
}
System.out.println(name+"用户离开了");
break;
}
}
}
}
import java.awt.*;
import java.io.*;
import java.net.*;
import java.applet.*;
import java.util.Hashtable;
ClientChat.java
public class ClientChat extends Applet implements Runnable
{
Socket socket=null;
DataInputStream in=null;
DataOutputStream out=null;
InputNameTextField 用户提交昵称界面=null;
ChatArea 用户聊天界面=null;
Hashtable listTable;
Label 提示条;
Panel north, center;
Thread thread;
public void init()
{
int width=getSize().width;
int height=getSize().height;
listTable=new Hashtable();
setLayout(new BorderLayout());
用户提交昵称界面=new InputNameTextField(listTable);
int h=用户提交昵称界面.getSize().height;
用户聊天界面=new ChatArea("",listTable,width,height-(h+5));
用户聊天界面.setVisible(false);
提示条=new Label("正在连接到服务器,请稍等...",Label.CENTER);
提示条.setForeground(Color.red);
north=new Panel(new FlowLayout(FlowLayout.LEFT));
center=new Panel();
north.add(用户提交昵称界面);
north.add(提示条);
center.add(用户聊天界面);
add(north,BorderLayout.NORTH);
add(center,BorderLayout.CENTER);
validate();
}
public void start()
{
if(socket!=null&&in!=null&&out!=null)
{ try
{
socket.close();
in.close();
out.close();
用户聊天界面.setVisible(false);
}
catch(Exception ee)
{
}
}
try
{
socket = new Socket(this.getCodeBase().getHost(), 6666);
in=new DataInputStream(socket.getInputStream());
out=new DataOutputStream(socket.getOutputStream());
}
catch (IOException ee)
{
提示条.setText("连接失败");
}
if(socket!=null)
{
InetAddress address=socket.getInetAddress();
提示条.setText("连接:"+address+"成功");
用户提交昵称界面.setSocketConnection(socket,in,out);
north.validate();
}
if(thread==null)
{
thread=new Thread(this);
thread.start();
}
}
public void stop()
{
try
{
socket.close();
thread=null;
}
catch(IOException e)
{
this.showStatus(e.toString());
}
}
public void run()
{
while(thread!=null)
{
if(用户提交昵称界面.get能否聊天()==true)
{
用户聊天界面.setVisible(true);
用户聊天界面.setName(用户提交昵称界面.getName());
用户聊天界面.setSocketConnection(socket,in,out);
提示条.setText("祝聊天愉快!");
center.validate();
break;
}
try
{
Thread.sleep(100);
}
catch(Exception e)
{
}
}
}
}
InputNameTextField。java
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import java.io.*;
import java.util.Hashtable;
public class InputNameTextField extends Panel implements ActionListener,Runnable
{
TextField nameFile=null;
String name=null;
Checkbox male=null,female=null;
CheckboxGroup group=null;
Button 进入聊天室=null,退出聊天室=null;
Socket socket=null;
DataInputStream in=null;
DataOutputStream out=null;
Thread thread=null;
boolean 能否聊天=false;
Hashtable listTable;
public InputNameTextField(Hashtable listTable)
{
this.listTable=listTable;
nameFile=new TextField(10);
group=new CheckboxGroup();
male=new Checkbox("男",true,group);
female=new Checkbox("女",false,group);
进入聊天室=new Button("进入");
退出聊天室=new Button("退出");
进入聊天室.addActionListener(this);
退出聊天室.addActionListener(this);
thread=new Thread(this);
add(new Label("昵称:"));
add(nameFile);
add(male);
add(female);
add(进入聊天室);
add(退出聊天室);
退出聊天室.setEnabled(false);
}
public void set能否聊天(boolean b)
{
能否聊天=b;
}
public boolean get能否聊天()
{
return 能否聊天;
}
public String getName()
{
return name;
}
public void setName(String s)
{
name=s;
}
public void setSocketConnection(Socket socket,DataInputStream in,DataOutputStream out)
{
this.socket=socket;
this.in=in;
this.out=out;
try{
thread.start();
}
catch(Exception e)
{
nameFile.setText(""+e);
}
}
public Socket getSocket()
{
return socket;
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==进入聊天室)
{
退出聊天室.setEnabled(true);
if(能否聊天==true)
{
nameFile.setText("您正在聊天:"+name);
}
else
{
this.setName(nameFile.getText());
String sex=group.getSelectedCheckbox().getLabel();
if(socket!=null&&name!=null)
{
try{
out.writeUTF("姓名:"+name+"性别:"+sex);
}
catch(IOException ee)
{
nameFile.setText("没有连通服务器"+ee);
}
}
}
}
if(e.getSource()==退出聊天室)
{
try
{
out.writeUTF("用户离开:");
}
catch(IOException ee)
{
}
}
}
public void run()
{
String message=null;
while(true)
{
if(in!=null)
{
try
{
message=in.readUTF();
}
catch(IOException e)
{
nameFile.setText("和服务器断开"+e);
}
}
if(message.startsWith("可以聊天:"))
{
能否聊天=true;
break;
}
else if(message.startsWith("聊天者:"))
{
String people=message.substring(message.indexOf(":")+1);
listTable.put(people,people);
}
else if(message.startsWith("不可以聊天:"))
{
能否聊天=false;
nameFile.setText("该昵称已被占用");
}
}
}
}
⑷ java 聊天室 源代码
【ClientSocketDemo.java 客户端Java源代码】
import java.net.*;
import java.io.*;
public class ClientSocketDemo
{
//声明客户端Socket对象socket
Socket socket = null;
//声明客户器端数据输入输出流
DataInputStream in;
DataOutputStream out;
//声明字符串数组对象response,用于存储从服务器接收到的信息
String response[];
//执行过程中,没有参数时的构造方法,本地服务器在本地,取默认端口10745
public ClientSocketDemo()
{
try
{
//创建客户端socket,服务器地址取本地,端口号为10745
socket = new Socket("localhost",10745);
//创建客户端数据输入输出流,用于对服务器端发送或接收数据
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
//获取客户端地址及端口号
String ip = String.valueOf(socket.getLocalAddress());
String port = String.valueOf(socket.getLocalPort());
//向服务器发送数据
out.writeUTF("Hello Server.This connection is from client.");
out.writeUTF(ip);
out.writeUTF(port);
//从服务器接收数据
response = new String[3];
for (int i = 0; i < response.length; i++)
{
response[i] = in.readUTF();
System.out.println(response[i]);
}
}
catch(UnknownHostException e){e.printStackTrace();}
catch(IOException e){e.printStackTrace();}
}
//执行过程中,有一个参数时的构造方法,参数指定服务器地址,取默认端口10745
public ClientSocketDemo(String hostname)
{
try
{
//创建客户端socket,hostname参数指定服务器地址,端口号为10745
socket = new Socket(hostname,10745);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
String ip = String.valueOf(socket.getLocalAddress());
String port = String.valueOf(socket.getLocalPort());
out.writeUTF("Hello Server.This connection is from client.");
out.writeUTF(ip);
out.writeUTF(port);
response = new String[3];
for (int i = 0; i < response.length; i++)
{
response[i] = in.readUTF();
System.out.println(response[i]);
}
}
catch(UnknownHostException e){e.printStackTrace();}
catch(IOException e){e.printStackTrace();}
}
//执行过程中,有两个个参数时的构造方法,第一个参数hostname指定服务器地址
//第一个参数serverPort指定服务器端口号
public ClientSocketDemo(String hostname,String serverPort)
{
try
{
socket = new Socket(hostname,Integer.parseInt(serverPort));
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
String ip = String.valueOf(socket.getLocalAddress());
String port = String.valueOf(socket.getLocalPort());
out.writeUTF("Hello Server.This connection is from client.");
out.writeUTF(ip);
out.writeUTF(port);
response = new String[3];
for (int i = 0; i < response.length; i++)
{
response[i] = in.readUTF();
System.out.println(response[i]);
}
}
catch(UnknownHostException e){e.printStackTrace();}
catch(IOException e){e.printStackTrace();}
}
public static void main(String[] args)
{
String comd[] = args;
if(comd.length == 0)
{
System.out.println("Use localhost(127.0.0.1) and default port");
ClientSocketDemo demo = new ClientSocketDemo();
}
else if(comd.length == 1)
{
System.out.println("Use default port");
ClientSocketDemo demo = new ClientSocketDemo(args[0]);
}
else if(comd.length == 2)
{
System.out.println("Hostname and port are named by user");
ClientSocketDemo demo = new ClientSocketDemo(args[0],args[1]);
}
else System.out.println("ERROR");
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
【ServerSocketDemo.java 服务器端Java源代码】
import java.net.*;
import java.io.*;
public class ServerSocketDemo
{
//声明ServerSocket类对象
ServerSocket serverSocket;
//声明并初始化服务器端监听端口号常量
public static final int PORT = 10745;
//声明服务器端数据输入输出流
DataInputStream in;
DataOutputStream out;
//声明InetAddress类对象ip,用于获取服务器地址及端口号等信息
InetAddress ip = null;
//声明字符串数组对象request,用于存储从客户端发送来的信息
String request[];
public ServerSocketDemo()
{
request = new String[3]; //初始化字符串数组
try
{
//获取本地服务器地址信息
ip = InetAddress.getLocalHost();
//以PORT为服务端口号,创建serverSocket对象以监听该端口上的连接
serverSocket = new ServerSocket(PORT);
//创建Socket类的对象socket,用于保存连接到服务器的客户端socket对象
Socket socket = serverSocket.accept();
System.out.println("This is server:"+String.valueOf(ip)+PORT);
//创建服务器端数据输入输出流,用于对客户端接收或发送数据
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
//接收客户端发送来的数据信息,并显示
request[0] = in.readUTF();
request[1] = in.readUTF();
request[2] = in.readUTF();
System.out.println("Received messages form client is:");
System.out.println(request[0]);
System.out.println(request[1]);
System.out.println(request[2]);
//向客户端发送数据
out.writeUTF("Hello client!");
out.writeUTF("Your ip is:"+request[1]);
out.writeUTF("Your port is:"+request[2]);
}
catch(IOException e){e.printStackTrace();}
}
public static void main(String[] args)
{
ServerSocketDemo demo = new ServerSocketDemo();
}
}
⑸ 求助高人:编辑简单聊天工具
我这里有一个简单的聊天室程序:包括服务器和客户端
用VB的winsock实现的,需要跟我联系就是,免费赠送。
QQ361656515
网络编程——聊天室(代码如下)
本程序是基于VB开发环境中Winsock控件的应用,遵循TCP/IP协议,利用该控件的套接字功能,实现远程计算机之间数据通信的,它由服务器和客户端组成。服务器用于连接多个客户端,可以统计已经连接过服务器的人数和服务器当前的在线人数,并负责收发各客户发送的消息,实现多个客户之间实时、准确、无误的数据通信。该程序可以连接1000个客户端,而如果要增减可供连接的客户端,只需对源程序的客户上限稍加改动即可。
工作原理
服务器:运行时声明一组Winsock控件数组,只创建该数组的第一个数组元素并从9999端口开始侦听(listen),当有客户端连接第一个Winsock控件并且连接成功时,触发Winsock_ConnectRequest()事件,端口数(Localport)递减1单位,此时运用Load Winsock(i)方法创建下一个Winsock控件数组元素并让它开始侦听,继续等待新客户端的连接,如此往复。当连接人数达到既定的客户端上限时,服务器便停止创建新的Winsock控件数组元素,停止侦听,即停止连接客户。服务器与客户端连接成功之后,通过Winsock的DataArrival()事件、SendData和GetData方法来实现数据的发送和接收。服务器中用一个Locked属性设定为True的文本框来记录所有客户发送的消息(聊天记录)。
客户端:运行时只创建一个Winsock控件,从9999开始递减依次指定Winsock的远程端口并依次连接远程服务器,一旦连接成功就停止指定端口,且由此可以开始和服务器通信。
用一个Locked属性设定为True的文本框来记录所有客户发送的消息,用一个可编辑的文本框来输入客户要发送的消息,这样就基本实现了聊天室的功能。
程序代码
服务器:
Option Explicit
Dim guest As Integer '在线客户数量计数器
Dim j As Integer '已接客户数量计数器
Dim k As Integer '向在线客户发送消息数量计数器
Dim t As Integer '关闭服务器时向在线客户发送消息数量计数器
Dim port As Integer '端口计数器
Dim msg As String '收发的消息文本
Dim newguest As Integer '新客户连接
Private Sub Form_Load()
If App.PrevInstance Then MsgBox "对不起!您已经创建了一个服务器^_^": End
j = 0
guest = 0
port = 9999
Text2 = Winsock1(0).LocalIP
Label3.Caption = "在线人数:" & guest
Label4.Caption = "已接人数:" & j
Winsock1(0).LocalPort = port 'Winsock控件数组第一个控件开始侦听
Winsock1(0).Listen
End Sub
Private Sub Form_Unload(Cancel As Integer) '关闭服务器时缓冲,发送断开信号
Cancel = 1
t = 0
Timer2.Enabled = 1
End Sub
Private Sub Timer1_Timer()
On Error Resume Next '错误处理
Winsock1(k).SendData msg '向所有客户发送即时收到的消息
k = k + 1
If k >= j Then Timer1.Enabled = 0
End Sub
Private Sub Timer2_Timer() '向客户发送断开信号
On Error Resume Next
msg = "closewinsock"
Winsock1(t).SendData msg
t = t + 1
If t > j Then End
End Sub
Private Sub Timer3_Timer() '向新客户发送欢迎信息
On Error Resume Next
If k = newguest Then Exit Sub
Winsock1(k).SendData msg
k = k + 1
If k >= j Then Timer3.Enabled = 0
End Sub
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
On Error Resume Next
Dim onlineperson As String
msg = ""
If Winsock1(Index).State <> sckClosed Then Winsock1(Index).Close '成功连接
Winsock1(Index).Accept requestID
j = j + 1 '统计已接人数
If guest + 1 < 10 Then
onlineperson = "currentonlineperson00" + CStr(guest + 1) + msg
ElseIf guest + 1 < 100 Then
onlineperson = "currentonlineperson0" + CStr(guest + 1) + msg
End If
Winsock1(Index).SendData onlineperson & "您是第" & CStr(j) & "位进入本聊天室的客户^_^" + Chr(13) + Chr(10)
msg = onlineperson & "第" & CStr(j) & "位客户进入了本聊天室" + Chr(13) + Chr(10)
Text1 = Text1 +"第" & CStr(j) & "位客户进入了本聊天室" + Chr(13) + Chr(10)
k = 0
newguest = Index
Timer3.Enabled = 1
Text1.SelStart = Len(Text1)
guest = guest + 1 '统计在线人数
Label3.Caption = "在线人数:" & guest
Label4.Caption = "已接人数:" & j
Load Winsock1(j)
port = port - 1
Winsock1(j).LocalPort = port
Winsock1(j).Listen
End Sub
Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Dim i As Integer
Dim onlineperson As String
msg = ""
Winsock1(Index).GetData msg '发送断开信号
If msg = "closewinsock" Then
msg = ""
Winsock1(Index).Close
If guest - 1 < 10 Then
onlineperson = "currentonlineperson00" + CStr(guest - 1)
ElseIf guest < 100 Then
onlineperson = "currentonlineperson0" + CStr(guest - 1)
End If
msg = "第" & CStr(Index + 1) & "位客户已经离开" + Chr(13) + Chr(10)
Text1 = Text1 + msg
msg = onlineperson & "第" & CStr(Index + 1) & "位客户已经离开" + Chr(13) + Chr(10)
Text1.SelStart = Len(Text1)
k = 0
Timer1.Enabled = 1
guest = guest - 1
Label3.Caption = "在线人数:" & guest
Label4.Caption = "已接人数:" & j
Exit Sub
End If
msg = "第" + CStr(Index + 1) + "位客户说:" + msg + Chr(13) + Chr(10)
Text1 = Text1 + msg
Text1.SelStart = Len(Text1)
k = 0
Timer1.Enabled = 1
End Sub
客户端:
Dim linkstate As Boolean '判断连接状态
Dim port As Integer '依次尝试连接的端口
Private Sub Cmdconnect_Click()
On Error Resume Next
Dim t As String
Dim x As String
Dim y As Integer
y = 0
If Len(Text1) = 0 Then Exit Sub '判断输入的IP地址是否合法
For i = 1 To Len(Text1)
If Mid(Text1, i, 1) <> "." Then
t = t + Mid(Text1, i, 1)
x = ""
Else
y = y + 1
x = x + Mid(Text1, i, 1)
t = ""
End If
If Len(t) > 3 Or x = ".." Or Left(Text1, 1) = "." Or Right(Text1, 1) = "." Then
MsgBox "请输入正确的IP地址^_^", vbOKOnly + vbInformation, "连接": Exit Sub
End If
Next i
If y <> 3 Then MsgBox "请输入正确的IP地址^_^", vbOKOnly + vbInformation, "连接": Exit Sub
If Text1 Like "*.*.*.*" Then
If Cmdconnect.Caption = "&Link" Then '用户选择连接
Cmdconnect.Caption = "&Break"
Timer1.Enabled = 1
Text1.Enabled = 0
Else '用户选择中断连接
Label4.Caption = "在线人数:0"
Text2 = Text2 + "连接中断" + Chr(13) + Chr(10)
Text2.SelStart = Len(Text2)
Timer1.Enabled = 0
Text1.Enabled = 1
Text1.SetFocus
Cmdconnect.Caption = "&Link"
Winsock1.SendData "closewinsock"
linkstate = False
port = 9999
Text3.Enabled = False
cmdsend.Enabled = False
End If
End If
End Sub
Private Sub cmdsend_Click()
On Error Resume Next '发送消息
Winsock1.SendData Text3
Text3 = ""
Text3.SetFocus
End Sub
Private Sub Form_Load()
linkstate = False
port = 9999
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
Winsock1.SendData "closewinsock" '向服务器发送断开信号
Cancel = 1
Timer2.Enabled = 1
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer) '禁止用户输入非法IP地址
If KeyAscii < 48 Or KeyAscii > 57 Then
If KeyAscii <> 8 And KeyAscii <> 46 Then KeyAscii = 0
End If
End Sub
Private Sub Text2_KeyPress(KeyAscii As Integer)
If Text3.Enabled = False Then Exit Sub
If KeyAscii = 13 Then Call cmdsend_Click
Text3 = Text3 + Chr(KeyAscii)
End Sub
Private Sub Text3_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then Call cmdsend_Click
End Sub
Private Sub Timer1_Timer() '从9999端口依次尝试连接服务器
If linkstate = True Then Exit Sub
Winsock1.Close
Winsock1.RemoteHost = Text1.Text
Winsock1.RemotePort = port
Winsock1.Connect
port = port - 1
If port < 9000 Then '设置可供连接的端口上限
Timer1.Enabled = 0
Text1.Enabled = 1
Cmdconnect.Caption = "&Link"
port = 9999
MsgBox "无法连接到服务器,请检查网络连接状况", vbOKOnly + vbCritical, "连接"
End If
End Sub
Private Sub Timer2_Timer() '缓冲以发送断开信号
End
End Sub
Private Sub Winsock1_Connect()
port = port + 1
Timer1.Enabled = 0
linkstate = True
Text3.Enabled = 0
cmdsend.Enabled = 0
MsgBox "已经成功连接", vbOKOnly + vbInformation, "连接"
Text3.Enabled = 1
cmdsend.Enabled = 1
Text3.SetFocus
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim msg As String
Winsock1.GetData msg '接收服务器传来的的数据并进行相应处理
If Left(CStr(msg), 19) = "currentonlineperson" Then
Label4.Caption = "在线人数:" & Str(Val(Mid(CStr(msg), 20, 3)))
msg = Right(CStr(msg), Len(CStr(msg)) - 22)
End If
If CStr(msg) = "closewinsock" Then
Call Cmdconnect_Click
Text2.SelStart = Len(Text2)
Exit Sub
End If
Text2 = Text2 + msg
Text2.SelStart = Len(Text2)
End Sub
⑹ java写一个简单的支持多人聊天的聊天室代码,不要用UI图形界面
我发现一个大虾的BLOG里有:
你自己去看一下,对不对你的胃口哦,我对JAVA不了解?