socket写即时通讯软件,求解决 socket即时通讯软件 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在调试时没事,不会自动重启。但是打开debug里的exe就会重启。 trycatch可能是客户端掉线了... 这是服务器前一部分的代码,我觉得应该是这部分的问题,后面的代码都是传递聊天信息啥的了 public partial class MainForm : Form { private List<User> userList = new List<User>(); /// 保存连接的所有用户 private string ServerIP;/// 服务器IP地址 private int port;/// 监听端口 private TcpListener myListener; bool isNormalExit = false;/// 是否正常退出所有接收线程 public MainForm() { InitializeComponent(); lst_State.HorizontalScrollbar = true; btn_Stop.Enabled = false; SetServerIPAndPort(); } /// 根据当前程序目录的文本文件‘ServerIPAndPort.txt’内容来设定IP和端口 /// 格式:127.0.0.1:8885 private void SetServerIPAndPort() { FileStream fs = new FileStream("ServerIPAndPort.txt", FileMode.Open); StreamReader sr = new StreamReader(fs); string IPAndPort = sr.ReadLine(); ServerIP = IPAndPort.Split(':')[0]; //设定IP port = int.Parse(IPAndPort.Split(':')[1]); //设定端口 sr.Close(); fs.Close(); } /// 开始监听 private void btn_Start_Click(object sender, EventArgs e) { myListener = new TcpListener(IPAddress.Parse(ServerIP), port); myListener.Start(); AddItemToListBox(string.Format("开始在{0}:{1}监听客户连接", ServerIP, port)); //创建一个线程监客户端连接请求 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); btn_Start.Enabled = false; btn_Stop.Enabled = true; } /// <summary> /// 接收客户端连接 /// </summary> private void ListenClientConnect() { TcpClient newClient = null; while (true) { try { newClient = myListener.AcceptTcpClient(); } catch { //当单击‘停止监听’或者退出此窗体时 AcceptTcpClient() 会产生异常 //因此可以利用此异常退出循环 break; } //每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息; User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.Add(user); AddItemToListBox(string.Format("[{0}]进入", newClient.Client.RemoteEndPoint)); AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count)); } } /// <summary> /// 处理接收的客户端信息 /// </summary> /// <param name="userState">客户端信息</param> private void ReceiveData(object userState) { int ac=0; int pa=0; User user = (User)userState; TcpClient client = user.client; while (isNormalExit == false) { string receiveString = null; try { //从网络流中读出字符串,此方法会自动判断字符串长度前缀 receiveString = user.br.ReadString(); } catch (Exception) { if (isNormalExit == false) { AddItemToListBox(string.Format("与[{0}]失去联系,已终止接收该用户信息", client.Client.RemoteEndPoint)); RemoveUser(user); } break; } AddItemToListBox(string.Format("来自[{0}]:{1}",user.client.Client.RemoteEndPoint,receiveString)); string[] splitString = receiveString.Split(','); if (splitString[0] == "~") { string[] AcAndPa = splitString[1].Split('+'); ac = int.Parse(AcAndPa[0]); //账号 pa = int.Parse(AcAndPa[1]); //密码 } switch(splitString[0]) { case "Login": //上线 //user.userName = splitString[1]; SendToAllClient(user,receiveString); break; case "Logout": //下线 SendToAllClient(user,receiveString); RemoveUser(user); return; case "Talk": //传递聊天信息 string talkString = receiveString.Substring(splitString[0].Length + splitString[1].Length + 2); AddItemToListBox(string.Format("{0}对{1}说:{2}",user.userName,splitString[1],talkString)); SendToClient(user,"talk," + user.userName + "," + talkString); foreach(User target in userList) { if(target.userName == splitString[1] && user.userName != splitString[1]) { SendToClient(target,"talk," + user.userName + "," + talkString); break; } } break; case "~": //登陆,验证账号密码 int ac1, pa1,le; bool aaa = true; le = GetRows("AcAndPa.txt"); FileStream fs = new FileStream("AcAndPa.txt", FileMode.Open); //账号密码表 StreamReader sr = new StreamReader(fs); string path; string AcAndPa1; AcAndPa1= sr.ReadLine(); ac1 = int.Parse(AcAndPa1.Split(':')[0]); pa1 = int.Parse(AcAndPa1.Split(':')[1]); for(int i=1;i<le;i++) { if (ac1 == ac && pa1 == pa) { path=ac1.ToString()+".txt"; FileStream ff= new FileStream(path, FileMode.Open); StreamReader ss = new StreamReader(ff); user.userName = ss.ReadLine(); user.bw.Write("ok," + user.userName); user.bw.Flush(); ss.Close(); ff.Close(); aaa = false; break; } else { AcAndPa1 = sr.ReadLine(); ac1 = int.Parse(AcAndPa1.Split(':')[0]); pa1 = int.Parse(AcAndPa1.Split(':')[1]); } } if (aaa == true) { user.bw.Write("no"); user.bw.Flush(); RemoveUser(user); isNormalExit = true; //user.Close(); //AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count)); } sr.Close(); fs.Close(); break; default: AddItemToListBox("什么意思啊:" + receiveString); break; } } } private int GetRows(string FilePath) { int l; using (StreamReader read = new StreamReader(FilePath, Encoding.Default)) { l=read.ReadToEnd().Split('\n').Length; return l; } } 你调试的时候是不是打断点了,然后程序能正常运行,如果是这样,你把线程sleep一秒试试,很有可能是一直处于监听状态,自己卡死的 不打断点的话,调试时也能正常运行。就是打开exe时监听时间长了没消息的话,就自动重启了 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); btn_Start.Enabled = false; btn_Stop.Enabled = true;在点击函数分配了一个线程,结果被垃圾内存回收机制给回收了.可以把Thread myThread 放到外边窗体的成员变量上看下. 这段代码可能会出现异常的地方不少,可以在每个函数体中另try catch捕获一下,以确定到底在哪里出现问题了 C# 如何读取 十六进制文件 转换出错?? ====如何读取App.config文件中的自定义配置节==== 有关datagrid排序的弱智问题哥哥姐姐们给个答案 一个属性是Collection类型,如何再运用PropertyGrid显示Collection中每个元素的属性 comboBox 的痴呆问题! 那里可以下载 .net 2005? c# List 查询的问题求解 请教:C#有字符串差异对比的 windows服务 c#如何将一个文件夹的东西复制到另一个文件夹 数组成员的get,set怎么做?
public partial class MainForm : Form
{
private List<User> userList = new List<User>(); /// 保存连接的所有用户
private string ServerIP;/// 服务器IP地址
private int port;/// 监听端口
private TcpListener myListener;
bool isNormalExit = false;/// 是否正常退出所有接收线程
public MainForm()
{
InitializeComponent();
lst_State.HorizontalScrollbar = true;
btn_Stop.Enabled = false;
SetServerIPAndPort();
} /// 根据当前程序目录的文本文件‘ServerIPAndPort.txt’内容来设定IP和端口
/// 格式:127.0.0.1:8885
private void SetServerIPAndPort()
{
FileStream fs = new FileStream("ServerIPAndPort.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
string IPAndPort = sr.ReadLine();
ServerIP = IPAndPort.Split(':')[0]; //设定IP
port = int.Parse(IPAndPort.Split(':')[1]); //设定端口
sr.Close();
fs.Close();
}
/// 开始监听
private void btn_Start_Click(object sender, EventArgs e)
{
myListener = new TcpListener(IPAddress.Parse(ServerIP), port);
myListener.Start();
AddItemToListBox(string.Format("开始在{0}:{1}监听客户连接", ServerIP, port));
//创建一个线程监客户端连接请求
Thread myThread = new Thread(ListenClientConnect);
myThread.Start();
btn_Start.Enabled = false;
btn_Stop.Enabled = true;
} /// <summary>
/// 接收客户端连接
/// </summary>
private void ListenClientConnect()
{
TcpClient newClient = null;
while (true)
{
try
{
newClient = myListener.AcceptTcpClient();
}
catch
{
//当单击‘停止监听’或者退出此窗体时 AcceptTcpClient() 会产生异常
//因此可以利用此异常退出循环
break;
}
//每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息;
User user = new User(newClient);
Thread threadReceive = new Thread(ReceiveData);
threadReceive.Start(user);
userList.Add(user);
AddItemToListBox(string.Format("[{0}]进入", newClient.Client.RemoteEndPoint));
AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count));
} } /// <summary>
/// 处理接收的客户端信息
/// </summary>
/// <param name="userState">客户端信息</param>
private void ReceiveData(object userState)
{
int ac=0;
int pa=0;
User user = (User)userState;
TcpClient client = user.client;
while (isNormalExit == false)
{
string receiveString = null;
try
{
//从网络流中读出字符串,此方法会自动判断字符串长度前缀
receiveString = user.br.ReadString();
}
catch (Exception)
{
if (isNormalExit == false)
{
AddItemToListBox(string.Format("与[{0}]失去联系,已终止接收该用户信息", client.Client.RemoteEndPoint));
RemoveUser(user);
}
break;
}
AddItemToListBox(string.Format("来自[{0}]:{1}",user.client.Client.RemoteEndPoint,receiveString));
string[] splitString = receiveString.Split(',');
if (splitString[0] == "~")
{
string[] AcAndPa = splitString[1].Split('+');
ac = int.Parse(AcAndPa[0]); //账号
pa = int.Parse(AcAndPa[1]); //密码
}
switch(splitString[0])
{
case "Login": //上线
//user.userName = splitString[1];
SendToAllClient(user,receiveString);
break;
case "Logout": //下线
SendToAllClient(user,receiveString);
RemoveUser(user);
return;
case "Talk": //传递聊天信息
string talkString = receiveString.Substring(splitString[0].Length + splitString[1].Length + 2);
AddItemToListBox(string.Format("{0}对{1}说:{2}",user.userName,splitString[1],talkString));
SendToClient(user,"talk," + user.userName + "," + talkString);
foreach(User target in userList)
{
if(target.userName == splitString[1] && user.userName != splitString[1])
{
SendToClient(target,"talk," + user.userName + "," + talkString);
break;
}
}
break;
case "~": //登陆,验证账号密码
int ac1, pa1,le;
bool aaa = true;
le = GetRows("AcAndPa.txt");
FileStream fs = new FileStream("AcAndPa.txt", FileMode.Open); //账号密码表
StreamReader sr = new StreamReader(fs);
string path;
string AcAndPa1;
AcAndPa1= sr.ReadLine();
ac1 = int.Parse(AcAndPa1.Split(':')[0]);
pa1 = int.Parse(AcAndPa1.Split(':')[1]);
for(int i=1;i<le;i++)
{
if (ac1 == ac && pa1 == pa)
{
path=ac1.ToString()+".txt";
FileStream ff= new FileStream(path, FileMode.Open);
StreamReader ss = new StreamReader(ff);
user.userName = ss.ReadLine();
user.bw.Write("ok," + user.userName);
user.bw.Flush();
ss.Close();
ff.Close();
aaa = false;
break;
}
else
{
AcAndPa1 = sr.ReadLine();
ac1 = int.Parse(AcAndPa1.Split(':')[0]);
pa1 = int.Parse(AcAndPa1.Split(':')[1]);
}
}
if (aaa == true)
{
user.bw.Write("no");
user.bw.Flush();
RemoveUser(user);
isNormalExit = true;
//user.Close();
//AddItemToListBox(string.Format("当前连接用户数:{0}", userList.Count));
}
sr.Close();
fs.Close();
break;
default:
AddItemToListBox("什么意思啊:" + receiveString);
break;
}
}
}
private int GetRows(string FilePath)
{
int l;
using (StreamReader read = new StreamReader(FilePath, Encoding.Default))
{
l=read.ReadToEnd().Split('\n').Length;
return l;
}
}
myThread.Start();
btn_Start.Enabled = false;
btn_Stop.Enabled = true;
在点击函数分配了一个线程,结果被垃圾内存回收机制给回收了.
可以把Thread myThread 放到外边窗体的成员变量上看下.