socketerror(解决连接服务器错误:如何应对Socket Error?)
一、socket未连接怎么办
如果您的手机应用Socket未连接,可能是由于以下原因:
1.网络连接问题:手机应用无法连接到服务器,可能是由于网络连接问题,例如您的手机没有联网或者网络不稳定等原因。
2.服务器连接问题:服务器端未成功开启或者未正常运行,导致无法与客户端建立连接。
3.端口号或IP地址设置错误:如果您的应用连接不到服务器,可能是因为设置的端口号或者IP地址不正确。
解决方法包括:
1.检查网络连接:确保您的手机联网,并且Wi-Fi或移动数据网络均可用。
2.检查服务器端连接:检查服务器端是否正常开启和运行,可以使用网络监控工具检查服务器是否可以正常访问。
3.检查端口号或者IP地址:检查应用程序连接服务器时输入的端口号或IP地址是否正确。可以尝试更改端口号或IP地址,或者使用默认设置。
4.检查防火墙设置:系统中的防火墙可能会限制或屏蔽应用程序对服务器的连接,可以检查防火墙设置并对应用程序进行开放。
二、错误:> 无法连接到远程服务器。Socket 错误 = #2000。
端口问题
自查
确定自己没开防火墙这个很关键,几乎所有的防火墙都默认关闭21端口
在cmd下打 telnet 127.0.0.1 21看端口是否开启
如果出现黑黑的一个页面说明21端口是开的
如果出现连接失败说明你自己的21端口有问题
查服务器
在cmd下打 telnet 218.244.128.40 21
测试是否是服务器21端口的问题
如果出现类似serv-u welcome的提示说明服务器是正常的
如果出现连接失败估计是服务器的问题
三、C#中用socket多线程处理服务器与客户端中出现异常
我以前写过类似的socket通信,虽然你用的方法和我的不太一样,但我还是感觉有一些问题
接受消息的时候,你用的是while(true)循环,当第一次将消息接受后,缓冲区就为空了,我想你再用循环去接收应该会出问题。
我记得有个poll方法,具体什么用途忘记了(很久没写代码了)你在循环里面加个if(clientsocket.Poll(1000, SelectMode.SelectRead))判断语句“clientsocket为你需要接收消息的socket”看看能不能解决,或者就用异步也可以,我可以发一下我以前的代码你参考下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace test4_2
{
public partial class Form1: Form
{
Socket connectSocket;
//Socket client;
byte[] bytes= new byte[1024];
delegate void listboxDel(string s);
listboxDel listboxdel;
public Form1()
{
InitializeComponent();
textBoxContent.Focus();
listboxdel= new listboxDel(listbox);
//为连接指派线程
Thread threadConnect= new Thread(new ThreadStart(Connect));
threadConnect.Start();
}
public void listbox(string str)
{
listBox1.Items.Add(str);
listBox1.SelectedIndex= listBox1.Items.Count- 1;
listBox1.ClearSelected();
}
//连接方法
public void Connect()
{
try
{
//建立连接socket
connectSocket= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//开始异步连接
connectSocket.BeginConnect(IPAddress.Parse("172.16.94.152"),
82,
new AsyncCallback(ConnectCallback),//定义回调函数代理
connectSocket);//传递给回调函数的状态
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
//连接方法的回调函数
private void ConnectCallback(IAsyncResult ar)
{
try
{
//从传递的状态中获取套接字,创建一个客户端套接字
Socket client=(Socket)ar.AsyncState;
//完成挂起的连接操作
client.EndConnect(ar);
listBox1.Invoke(listboxdel,"连接服务器成功,可以开始通话!");
client.BeginReceive(bytes, 0, 1000, 0, new AsyncCallback(receivecallback), client);
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
}
}
public void receivecallback(IAsyncResult ar)
{
try
{
Socket client=(Socket)ar.AsyncState;
int length= client.EndReceive(ar);
listBox1.Invoke(listboxdel, Encoding.UTF8.GetString(bytes, 0, length));
client.BeginReceive(bytes, 0, 1000, 0, new AsyncCallback(receivecallback), client);
}
catch
{
}
}
//发送方法
private void Send(String data)
{
//使用ASCII转换字符串为字节序列
byte[] byteData= Encoding.UTF8.GetBytes(data);//将字符串转换成字节序列
//开始向远端设备发送数据
connectSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None,
new AsyncCallback(SendCallback), connectSocket);
}
//发送方法的回调函数
private void SendCallback(IAsyncResult ar)
{
try
{
//从传递的状态中获取套接字,创建一个客户端套接字
Socket client=(Socket)ar.AsyncState;
//结束异步数据传输操作,返回传输的字节数
int bytesSent= client.EndSend(ar);
listBox1.Invoke(listboxdel, textBoxUser.Text+":"+ textBoxContent.Text);
}
catch(Exception e)
{
MessageBox.Show(e.ToString());
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
Send(textBoxUser.Text+":"+textBoxContent.Text);
}
}
}