读书人

小弟我快被SOCKET折磨死了大家帮小弟

发布时间: 2013-10-04 21:41:43 作者: rapoo

我快被SOCKET折磨死了,大家帮我看一下C#代码吧(简洁易懂)
本帖最后由 u011708759 于 2013-10-03 09:43:17 编辑 服务器:


//不解释,跳过
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;
using System.IO;
using System.Threading;



namespace Socket_Programing_Test
{

public partial class Form1 : Form
{
//声明变量,tcpclient,端口和委托
TcpListener tcplistener;
int port;
delegate void AppendStringDelegate(string str);
AppendStringDelegate appendstringdelegate;


public Form1()
{
InitializeComponent();
appendstringdelegate = new AppendStringDelegate(AppendString);
}

private void button建立连接_Click(object sender, EventArgs e)
{
//从textbox1中获取端口
port = Convert.ToInt32(textBox1.Text);
try
{
tcplistener = new TcpListener(IPAddress.Any,port);
tcplistener.Start();
}
catch(Exception ex)
{
listBox1.Items.Add("失败");
listBox1.Items.Add(ex.Message);
return;
}
//建立新的线程用于获取客户端请求信息
ThreadStart ts = new ThreadStart(Listenclientconnect);
Thread mythread = new Thread(ts);
mythread.Start();

listBox1.Items.Add("成功");

}

private void Listenclientconnect()
{

while (true)
{
TcpClient newclient;
try
{
newclient = tcplistener.AcceptTcpClient();
}
catch
{
break;
}

ParameterizedThreadStart pts = new ParameterizedThreadStart(ReceiveData);
Thread receivethread = new Thread(pts);
receivethread.Start(newclient);
}


}

private void ReceiveData(object obj)
{

TcpClient client= (TcpClient)obj;
NetworkStream networkstream =client.GetStream();
StreamReader sr=new StreamReader(networkstream);
bool exit=false;
while(exit==false)
{
string receivestring = null;
try
{
receivestring = sr.ReadLine();
}
catch
{
return;
}

switch(receivestring)
{

case "Login" :
listBox1.Invoke(appendstringdelegate,"一位用户已进入");
break;
case "Logout" :
listBox1.Invoke(appendstringdelegate,"一位用户离开");
break;
default:
break;
}
client.Close();
}
}

private void button2_Click_1(object sender, EventArgs e)//关闭tcplistener
{

tcplistener.Stop();

listBox1.Items.Add("成功关闭");
}

private void AppendString(string str)
{
listBox1.Items.Add(str);

}

}
}


服务器运行正常,可以建立并且监听,问题出在客户端无法通过广域网连接服务器(但输入局域网IP却可以)!!!

客户端代码:

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;
using System.IO;
using System.Threading;



namespace Socket_Programing_Test__client_
{
public partial class Form1 : Form
{
TcpClient tcpclient;
IPAddress Serverip;
int port;

public Form1()
{
InitializeComponent();

}


private void Form1_Load(object sender, EventArgs e)
{
listBox1.Items.Clear();
}

private void button1_Click(object sender, EventArgs e)
{
port = Convert.ToInt32(textBox2.Text);

IPAddress[] ip1 = Dns.GetHostAddresses( textBox1.Text);
Serverip = ip1[0];
IPEndPoint ipep=new IPEndPoint(serverip,port);

try
{
tcpclient = new TcpClient();
tcpclient.Connect(ipep);
}
catch(Exception ex)//如果输入广域网IP,抛出异常:“由于目标计算机积极拒绝,无法连接”
{
listBox1.Items.Add("连接服务器失败");
listBox1.Items.Add(ex.Message);
return;
}
listBox1.Items.Add("连接成功");
}
}
}


如果客户端输入服务器的局域网IP,连接成功,但输入广域网IP,抛出异常:“由于目标计算机积极拒绝,无法连接”,我代码有问题么? socket C# 网络编程 C/S架构 服务器
[解决办法]
是不是防火墙设置问题?
看看你的服务器的局域网和广域网都是怎么连接上的 单网卡还是双网卡
使用ping命令测试看看广域网ip可否ping通
至于端口占用估计不太可能

读书人网 >C#

热点推荐