【发布时间】:2012-03-06 02:26:53
【问题描述】:
我是 C# 新手,正在练习 Socket 编程。
首先我创建了一个服务器供客户端连接。
服务器:
class Program {
static void Main(string[] args) {
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 1900);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}:", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while (true) {
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(data, recv, SocketFlags.None, Remote);
}
}
}
客户:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace serverUDPWF {
public partial class ServerForm : Form {
byte[] data = new byte[30];
string input = "";
string stringData = "";
IPEndPoint iep,sender;
Socket server;
string welcome = "";
int recv;
EndPoint tmpRemote;
public ServerForm() {
InitializeComponent();
startServer();
}
public void startServer() {
iep = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 1900);
server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, iep);
sender = new IPEndPoint(IPAddress.Any, 0);
tmpRemote = (EndPoint)sender;
data = new byte[30];
recv = server.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine();
listBox1.Items.Add("Message received from {0}:" + tmpRemote.ToString());
listBox1.Items.Add(Encoding.ASCII.GetString(data, 0, recv));
}
private void sendMessageToserver(object sender, EventArgs e) {
if (textBox2.Text == "") {
MessageBox.Show("Please Enter Your Name");
}
else {
int i = 30;
input = textBox2.Text + ": " + textBox1.Text;
if (input == "exit") {
this.Close();
}
server.SendTo(Encoding.ASCII.GetBytes(input), tmpRemote);
textBox1.Text = "";
data = new byte[i];
try {
recv = server.ReceiveFrom(data, ref tmpRemote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
listBox1.Items.Add(stringData);
}
catch (SocketException) {
listBox1.Items.Add("WARNING: data lost, retry message.");
i += 10;
}
}
}
}
}
我的问题是如何让客户端不需要像127.0.0.1那样输入服务器IP地址。我的第二个问题是我同时打开了 2 个客户端,但是客户端 A 向服务器发送了一条消息,但客户端 B 没有收到来自客户端 A 的消息(我想发送一个广播类型的消息)
我该怎么做?
【问题讨论】:
-
“让客户端不需要输入服务器IP地址”是什么意思?
-
我的意思是在 LAN 网络中,客户端只需向服务器发送一条消息,但它不需要定义服务器 IP 它只发送一条广播消息,服务器只需打开一个端口,如 1900,当客户端通过此端口,服务器捕获此消息,客户端可以连接到服务器