网络编程聊天室项目(编写聊天室程序)
vb 网络编程
Dim S As String
Dim ss As String
Dim i As Integer
Dim recUser As String
Dim senUser As String
Dim senIP As String
sckServer(index).GetData S '接收信息到 s
If userState(index) = 0 Then '如果是刚进来,winsock尚未使用的话
senUser = Trim(S)
senIP = sckServer(index).RemoteHostIP
If InStr(1, senUser, "*") = 1 Then
senUser = Right(senUser, Len(senUser) - 1)
Else
If checkUserName(senUser) = 1 Then
Call SendToOne("SystemOrder:姓名重复,客户端退出重进!", index)
Exit Sub
End If
If checkUserIP(senIP) = 1 Then
Call SendToOne("SystemOrder:IP重复,客户端退出重进!", index)
Exit Sub
End If
End If
S = "~~~~~~欢迎 " senUser " 进入聊天室!~~~~~~~"
userState(index) = 1 '设置用户状态为正常在线
user(index) = senUser
userIP(index) = senIP
List1.AddItem user(index) '加入到在线列表
Combo1.AddItem user(index)
zxrs = zxrs + 1
Label1.Caption = " " zxrs "人在线"
Call SendToAllExcept("SystemOrder:addtolist" user(index) "038868", index)
For i = 0 To List1.ListCount - 1
ss = ss List1.List(i) "038868"
Next
Call SendToOne("SystemOrder:addtolist" ss, index)
End If
If InStr(1, S, "038868SendToOne") = 0 Then
Call SendToAll(S) '广播方式
Else
recUser = Left(S, InStr(1, S, "038868SendToOne") - 1)
S = Right(S, Len(S) - Len(recUser) - Len("038868SendToOne"))
Call SendToOne(S, FindSckIndex(recUser))
If user(index) recUser Then Call SendToOne(S, index)
End If
'将所发信息也写入服务器
Call AddToText1(S)
End Sub
这是我做的一个聊天程序.不过我也是从网上下的源程序.这段程序我没有改,如果你想要的话我可以给你发过去.QQ:170985401
呵呵.发到你邮箱了.查收吧.

毕业设计要求做个小型网络聊天室,据说要用java编写程序,可是我没学过这门语言对Java一窍不通。请高手帮
我跟你说吧
你查一下啊 socket 和serversocket编程 。。主要是用这两个类。。。建议你找java网络编程这本书 。。有源码的
速求用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();
}
}
java 网络编程中 tcp连接问题。 例如编写聊天室 , c/s结构的c和s端都是不间断实现请求--响应 。
你的意思我差不多明白了,现在我跟你说下那个两个人猜拳的一个思路
服务端是可以查看客户端连接情况的
你可以在客户端弄一个Map 用服务端的IP 作为键 , 发送的消息作为值存放
客户端发送消息后就存放在Map里面
当服务端接收到两边客户端都有传入消息,就根据IP 取出值来比较
然后将结果返回给客户端
其实那个多人聊天,需要所有人发言后才会公布广播的,也可以按照这个思路去做
你好,请问网络编程聊天室程序运行后出错,服务器端显示 accept:invalid argument.这个问题你解决了吗?
这样的写法有点问题:1)服务器端既然采用了异步方式Accept,就没有必要再启线程2)估计allDone是一个ManualResetEvent。用ManualResetEvent的目的什么呢?服务器端采用异步Accept的代码其实很简单,也不需要ManualResetEvent同步 public class AppTCPServer { public AppTCPServer(string localIP, int port) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint localEP = new IPEndPoint(IPAddress.Parse(localIP), port); socket.Bind(localEP); socket.Listen(100); socket.BeginAccept(AcceptAsync, socket); } private void AcceptAsync(IAsyncResult ar) { Socket socket = ar.AsyncState as Socket; try { Socket client = socket.EndAccept(ar); Console.WriteLine("客户端连接成功!客户端:{0}", client.RemoteEndPoint.ToString()); if (OnConnected != null) { OnConnected(this, new ClientConnectedEventArgs(client)); } } catch (Exception e) { Console.WriteLine("AcceptAsync发生异常,异常信息:\n{0}", e.Message); } finally { //继续异步Accept socket.BeginAccept(AcceptAsync, socket); } } //客户端连接后的事件 OnConnect public event EventHandler OnConnected; } /// /// 事件参数:接收客户端连接后的事件参数 /// public class ClientConnectedEventArgs : EventArgs { public ClientConnectedEventArgs(Socket clientSocket) { ClientSocket = clientSocket; } public Socket ClientSocket { get; private set; } } class Program { static void Main(string[] args) { AppTCPServer server = new AppTCPServer("127.0.0.01", 8000); server.OnConnected += server_OnConnected; Console.WriteLine("按任意键结束程序……"); Console.ReadKey(); } static void server_OnConnected(object sender, ClientConnectedEventArgs e) { Socket client = e.ClientSocket; string hello = "Hello from AppTCPServer"; client.Send(Encoding.Default.GetBytes(hello)); } } 客户端测试程序 class Program { static void Main(string[] args) { //模拟100个客户连接服务器 for (int i = 0; i 100; i++) { Socket socket = ConnectToServer("127.0.0.1", 8000); byte[] buffer = new byte[1024]; int bytesRecevied = socket.Receive(buffer, buffer.Length, SocketFlags.None); byte[] messageBytes = new byte[bytesRecevied]; Array.Copy(buffer, messageBytes, bytesRecevied); Console.WriteLine(Encoding.Default.GetString(messageBytes)); socket.Disconnect(false); socket.Close(); } Console.ReadKey(); static Socket ConnectToServer(string serverIP, int serverPort) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint localEP = new IPEndPoint(IPAddress.Any, 0); socket.Bind(localEP); socket.Connect(new IPEndPoint(IPAddress.Parse(serverIP), serverPort)); return socket; } }