由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址 但是服务端可以登入并且保存QQ号码和ip 一发信息就错192行错的

xaoqizeng 2019-05-30 07:14:19
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace QQ_Server
{
public partial class Form1 : Form
{
//string Id = "";//存储客户端QQ号
// bool bo = false;//记录该用户是否上线
//将远程连接的客户端的ip地址和Socket存入集合中
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();

//将远程连接的客户端的QQ和ip存入集合中
Dictionary<string, string> Idip = new Dictionary<string, string>();
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//关闭线程监测
Control.CheckForIllegalCrossThreadCalls = false;
}


private void button1_Click(object sender, EventArgs e)
{
//try
//{
//192.168.43.15
//创建一个ip地址和端口号的Socket
Socket socketwatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("我的ip就不给你们看了");
//192.168.43.15:8500
//创建端口对象
IPEndPoint point = new IPEndPoint(ip, 8500);
socketwatch.Bind(point);//监听
Add("开始监听");
socketwatch.Listen(10);//同一时间最大监听

//创建一个线程监听客户端
Thread th = new Thread(Lis);
th.IsBackground = true;
th.Start(socketwatch);
//}
//catch
//{ }
}




/// <summary>
/// 一直等待客户端连接,并且创建一个负责通信的Socket
/// </summary>
/// <param name="o"></param>
Socket socketSend;
void Lis(object o)
{
Socket socketwatch = o as Socket;

while (true)
{
//try
//{
socketSend = socketwatch.Accept();
Add(socketSend.RemoteEndPoint.ToString() + ":连接成功");
dic.Add(socketSend.RemoteEndPoint.ToString(), socketwatch);//存入集合
//开启一个新线程,不停的接受客户端发送过来的消息
Thread th = new Thread(Rec);
th.IsBackground = true;
th.Start();
//}
//catch
//{

//}
}
}

//.poll(10,selectmode.selectread)
/// <summary>
/// 服务器不停的接受客户端发送过来的消息
/// </summary>
/// <param name="o"></param>
List<string> lis = new List<string>();
void Rec(object o)
{
socketSend = o as Socket;
//bool se = Send1.Poll(10, SelectMode.SelectRead);
//if (se)
//{
// Add(Send.RemoteEndPoint.ToString() + "断开连接");
//}
string qqstr = "";
//for (int i = 0; i < 1; )
//{
// try
// {
// //接受客户端发送的消息
// byte[] by = new byte[1024 * 1024 * 2];
// //实际接受到的有效字节数
// int r = Send.Receive(by);
// if (r == 0) break;
// qqstr = Encoding.UTF8.GetString(by, 0, r);
// }
// catch
// {
// }
// try
// {
// Idip.Add(qqstr, Send.RemoteEndPoint.ToString());//存储用户的QQ号和登入的ip
// i++;
// }
// catch
// {
// MessageBox.Show("别的地方有人登入了,你登柠檬呢", "你的父亲说:");
// }


//}
while (true)
{
//try
//{
//接受客户端发送的消息
byte[] by = new byte[1024 * 1024 * 2];

Add("准备接受信息");
//实际接受到的有效字节数
int r = socketSend.Receive(by);
if (r == 0) continue ;

string Ex = Encoding.UTF8.GetString(by, 0,r);//查看是否退出
string js = Encoding.UTF8.GetString(by, 0, 3);//查看是否自己QQ
if (js == "199")
{
qqstr = Encoding.UTF8.GetString(by, 3, r-3);//查看是否自己QQ
Idip.Add(qqstr, socketSend.RemoteEndPoint.ToString());//存储用户的QQ号和登入的ip
continue;
}
if (Ex == "10086")
{
Idip.Remove(qqstr);
Add(socketSend.RemoteEndPoint.ToString() + ":断开连接");
//socket.Close();
}
//把byte转换成字符串
string qqshu = Encoding.UTF8.GetString(by, 0, r);//QQ位数
char[] ch = qqshu.ToCharArray();
int sum = 0;
for (int i = 0; i < ch.Length; i++)
{
if (ch[i] != '0') break;
sum++;
}
string qq = Encoding.UTF8.GetString(by, sum, sum);//要发送的qq



string Iqqshu = Encoding.UTF8.GetString(by, sum * 2,r-sum*2);//自己QQ数
char[] chI = Iqqshu.ToCharArray();
int sumI = 0;
for (int i = 0; i < chI.Length; i++)
{
if (chI[i] != '0') break;
sumI++;
}
string Iqq = Encoding.UTF8.GetString(by, sum * 2+sumI, sumI);//自己QQ

string str = Encoding.UTF8.GetString(by, sum * 2+sumI*2, r - (sum*2+sumI*2));//要发送的信息
byte[] byt = System.Text.Encoding.UTF8.GetBytes(str);
SQL sql = new SQL();
lis.Add(qq);
bool bo = sql.storage(str, Iqq, qq);
string va = dic_cha(qq);//检查该QQ是否在线
if (va == null) continue;
if (bo == true)
{
dic[va].Send(byt);
}

//}
//catch
//{
//}
}
}



string dic_cha(string QQ)
{
foreach (KeyValuePair<string, string> item in Idip)
{
if (item.Key == lis[0])
{
string va = item.Value;
lis.RemoveAt(0);
return va;
}
}
lis.RemoveAt(0);
return null;
}

void Add(string va)
{
richTextBox1.AppendText(va + "\r\n");
}



/// <summary>
/// 发送消息给客户端
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
//String str = this.textBox1.Text.Trim();
//byte[] bu = System.Text.Encoding.UTF8.GetBytes(str);
////Send.Send(bu);
}



}

}
...全文
189 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这 谁能调试跑啊。 你肯定调试 怀疑哪里出错, 然后在研究
耗子哭死猫 2019-05-31
  • 打赏
  • 举报
回复
你把你的错误贴出来呀

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧