读书人

c# 网络编程的有关问题(非常紧急)待

发布时间: 2011-12-29 22:09:38 作者: rapoo

c# 网络编程的问题(非常紧急)在线等待
服务器
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Collections;
using System.Threading;
using XuLIeHua;
using System.Messaging;
namespace 网络聊天
{
public partial class frmServer : Form
{
public frmServer()
{
InitializeComponent();
}
private TcpListener Listen;
private Thread th;
private LogText log;
private bool QUIT;
private TcpClient Client;
private static Dictionary <int, TcpClient> s_socket;
private void button1_Click(object sender, EventArgs e)
{
try
{
Listen.Start();
th.Start();

}
catch(Exception err)
{
log.LogWriter(err.Message);
}
}
private void JianKong()
{
try
{
while (QUIT == true)


{

if (Listen.Pending() == true)
{
log.LogWriter( "有人链接 ");
Client = Listen.AcceptTcpClient();
s_socket.Add(GetId, Client);
Thread TongXun = new Thread(new ThreadStart(TongXunSub));
TongXun.IsBackground = true;
TongXun.Start();
}
//Thread.Sleep(100);
}

log.LogWriter( "结束 ");
}
catch (Exception err)
{
log.LogWriter(err.Message);
}
}
private int GetId
{
get
{
return s_socket.Count;
}
}


private NetworkStream SelectIp(string Ip)
{
try
{
for (int i = 0; i < s_socket.Count; i++)
{
if (GetIp(s_socket[i]) == Ip)
{
return s_socket[i].GetStream();
}
}
return null;
}
catch
{
return null;
}
}
private string GetIp(TcpClient tcpclient)
{
try
{
EndPoint ePoint = (EndPoint)tcpclient.Client.RemoteEndPoint;
string[] ip = ePoint.ToString().Split(new char[1] { ': ' });
if (ip.Length > 0)
{
return ip[0];
}
return null;


}
catch
{
return null;
}
}
private void TongXunSub()
{
try
{
TcpClient TcpC = Client;
NetworkStream NetStr = TcpC.GetStream();
while (TcpC != null)
{
if (NetStr.DataAvailable == true)
{
MemoryStream Memory = new MemoryStream();
byte[] tmp = new byte[1024];
int Len = 1;
while (Len != 0)
{
if (NetStr.DataAvailable == false) { break; }
Len = NetStr.Read(tmp, 0, tmp.Length);
Memory.Write(tmp, 0, Len);


}

NetMsg Msg = (NetMsg)XuLIe.ByteToObj(Memory.ToArray());
if (Msg.JieShouIp != " ")
{
NetworkStream NetWork;
if (Msg.JieShouIp != GetIp(TcpC))
{
NetWork = SelectIp(Msg.JieShouIp);
}
else
{ NetWork = NetStr; }
log.LogWriter( "发送消息:接收IP " + Msg.JieShouIp + " ");
if (NetWork != null)
{
byte[] sTmp = XuLIe.ObjToByte(Msg);


NetWork.Write(sTmp, 0, sTmp.Length);
sTmp = null;
}
}
}
Thread.Sleep(500);
}
}
catch (SocketException err)
{
log.LogWriter(err.Message);
return;
}
catch(Exception err)
{
log.LogWriter(err.Message);
return;
}
}
private void frmServer_Load(object sender, EventArgs e)
{
log = new LogText( "服务器 ");
QUIT = true;

label1.Text = " ";
s_socket = new Dictionary <int, TcpClient> ();
timer1.Enabled = true;


Listen = new TcpListener(Dns.GetHostAddresses(Dns.GetHostName())[0], 9000);
th = new Thread(new ThreadStart(JianKong));
th.IsBackground = true;
listBox1.Items.Add(Dns.GetHostAddresses(Dns.GetHostName())[0].ToString());
}

private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = "当前 " + s_socket.Count.ToString() + "个连接 ";
}

private void frmServer_FormClosing(object sender, FormClosingEventArgs e)
{
th.Abort();
QUIT = false;
Thread.Sleep(500);
Application.ExitThread();
}
}
}

[解决办法]
把获取IP的那段代码先注释掉,你就用String IP= "192.168.0.* ";,然后IPAddress.parse(ip)
[解决办法]
1:服务器端开始监听的IP,和端口打印到日志中.
2:客户端连接时,把要连接的服务器IP和端口打印到日志中.
对比.

读书人网 >C#

热点推荐