客户端与服务器-C#客户端为什么连接不上服务器,当ip地址为127.0.0.1是没有问题的

问题描述

C#客户端为什么连接不上服务器,当ip地址为127.0.0.1是没有问题的

就是自己的电脑是连接路由器的,但是ip不是192.168.开头的,不知道是公网问题还是什么问题,测试都是用自己的一台电脑的。

解决方案

服务端Server
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private void textBox2_TextChanged(object sender, EventArgs e)
    {

    }
    /// <summary>
    /// 开始监听
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    ///
    Socket socketSend;
    private void btnStart_Click(object sender, EventArgs e)
    {
        try
        {
            //当点击开始监听时,创建一个负责监听IP地址和端口号的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建ip对象
            IPAddress ip=IPAddress.Any;//IpAddress.Parse(txtServer.Text);
            //创建端口对象
            IPEndPoint point=new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
            //监听端口
            socketWatch.Bind(point);
            ShowMsg("启动成功");
            btnStart.Enabled = false;//按钮只能按一次
            //表示每次只能容纳10个,不代表总容量为10
            socketWatch.Listen(10);
            ////等待客户端连接Accept,并且返回一个负责通信的Socket
            //Socket socketSend=socketWatch.Accept();
            ////socketSend.RemoteEndPoint--返回连接客户端的IP地址
            //ShowMsg(socketSend.RemoteEndPoint.ToString()+":连接成功");

            //创建线程接收Listen函数
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);
        }
        catch { }
    }
    //将连接的客户端的ip地址和SocketSend存入 键值对集合中
    Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
    /// <summary>
    /// 等待客户端的 连接,并且创建一个与之通信的Socket
    /// </summary>
    /// <param name="obj"></param>
    void Listen(object obj)
    {
        Socket socketWatch = obj as Socket;//as做类型转换,如果返回的是Socket对象就是返回他,不是就返回null
       //用循环,一直等待客户端连接
        while (true)
        {
            try
            {
                //等待客户端连接Accept,并且返回一个负责通信的Socket
                socketSend = socketWatch.Accept();

                //将连接的客户端的ip地址和SocketSend存入 键值对集合中
                dicSocket.Add(socketSend.RemoteEndPoint.ToString(),socketSend);
                //客户端的ip地址存入下拉框
                cboUser.Items.Add(socketSend.RemoteEndPoint.ToString());
                //socketSend.RemoteEndPoint--返回连接客户端的IP地址
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功");
                //下拉框默认选中第一个
                cboUser.SelectedIndex = 0;

                //开启一个新线程来接收客户端发过来的消息
                Thread th = new Thread(Receive);
                th.IsBackground = true;
                th.Start(socketSend);
            }
            catch { }

        }
    }
    /// <summary>
    /// 不停的接收客户端发过来的消息
    /// </summary>
    /// <param name="obj"></param>
    void Receive(object obj)
    {
        Socket socketSend = obj as Socket;
        while (true)
        {
            try
            {
                //接收客户端发过来的消息
                byte[] buffer = new byte[1024 * 1024 * 2];
                //实际接收的数据r
                int r = socketSend.Receive(buffer);
                if (r == 0)
                {
                    //当r为0的时候表示用户下线,跳出接收循环
                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "已经下线");
                    break;
                }
                //将字节转换为字符
                string msg = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + msg);

                //将客户端的消息发回去
                SendMsg(msg);
            }
            catch { }
        }
    }
    /// <summary>
    /// 服务器向客户端发信息
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button4_Click(object sender, EventArgs e)
    {
        try
        {
            string msg = txtSend.Text.Trim();
            //打印到自己的控制台中
            ShowMsg("服务器:"+msg);
            //将消息发给对方
            SendMsg(msg);
        }
        catch { }
    }
    /// <summary>
    /// 服务器向客户端发信息
    /// </summary>
    void SendMsg(string msg)
    {
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
        List<byte> list = new List<byte>();
        list.Add(0);//表示发送的是文字
        list.AddRange(buffer);
        byte[] newBuffer = list.ToArray();
        //buffer=list.toArray()//不能这样赋值,因为长度不一
        //获得用户下拉框选中的ip地址
        //cboUser.SelectedIndex = 0;
        string ip = cboUser.SelectedItem.ToString();
        dicSocket[ip].Send(newBuffer);
        //socketSend.Send(buffer);
        txtSend.Text = ""; //清空发送栏
    }
    /// <summary>
    /// 打印文字到TextBox中
    /// </summary>
    /// <param name="str"></param>
    void ShowMsg(string str)
    {
        //之所以不是Text,防止覆盖
        txtLog.AppendText(str + "
");
    }
    /// <summary>
    /// 程序加载就取消跨线程访问
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form1_Load(object sender, EventArgs e)
    {
        Control.CheckForIllegalCrossThreadCalls = false;
    }
    /// <summary>
    /// 选择发送的文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "请选择你要发送的文件";
            ofd.Filter = "文件文件|*.txt|图片文件|*.jpg|全部文件|*.*";
            ofd.InitialDirectory = @"C:UsersAdministratorDesktop";
            ofd.ShowDialog();
            string path = ofd.FileName;
            txtPath.Text = path;//Path.GetFileName(path);
        }
        catch { }
    }
    /// <summary>
    /// 发送文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            //获得发送文件的路径
            string path = txtPath.Text;
            if (path == "")
            {
                return;
            }
            using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
            {
                byte[] buffer = new byte[1024 * 1024 * 100];
                int r = fsRead.Read(buffer, 0, buffer.Length);
                List<byte> listFile = new List<byte>();
                listFile.Add(1);//1表示发送的是文件
                listFile.AddRange(buffer);
                byte[] newBuffer = listFile.ToArray();
                dicSocket[cboUser.SelectedItem.ToString()].Send(newBuffer, 0, r+1, SocketFlags.None);
            }
        }
        catch { }
    }

    private void button5_Click(object sender, EventArgs e)
    {
        try
        {
            byte[] buffer = new byte[1];
            buffer[0] = 2;
            dicSocket[cboUser.SelectedItem.ToString()].Send(buffer);
        }
        catch { }

    }

    private void cboUser_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
}

}


解决方案二:

服务端Server
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private void textBox2_TextChanged(object sender, EventArgs e)
    {

    }
    /// <summary>
    /// 开始监听
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    ///
    Socket socketSend;
    private void btnStart_Click(object sender, EventArgs e)
    {
        try
        {
            //当点击开始监听时,创建一个负责监听IP地址和端口号的Socket
            Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建ip对象
            IPAddress ip=IPAddress.Any;//IpAddress.Parse(txtServer.Text);
            //创建端口对象
            IPEndPoint point=new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
            //监听端口
            socketWatch.Bind(point);
            ShowMsg("启动成功");
            btnStart.Enabled = false;//按钮只能按一次
            //表示每次只能容纳10个,不代表总容量为10
            socketWatch.Listen(10);
            ////等待客户端连接Accept,并且返回一个负责通信的Socket
            //Socket socketSend=socketWatch.Accept();
            ////socketSend.RemoteEndPoint--返回连接客户端的IP地址
            //ShowMsg(socketSend.RemoteEndPoint.ToString()+":连接成功");

            //创建线程接收Listen函数
            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketWatch);
        }
        catch { }
    }
    //将连接的客户端的ip地址和SocketSend存入 键值对集合中
    Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
    /// <summary>
    /// 等待客户端的 连接,并且创建一个与之通信的Socket
    /// </summary>
    /// <param name="obj"></param>
    void Listen(object obj)
    {
        Socket socketWatch = obj as Socket;//as做类型转换,如果返回的是Socket对象就是返回他,不是就返回null
       //用循环,一直等待客户端连接
        while (true)
        {
            try
            {
                //等待客户端连接Accept,并且返回一个负责通信的Socket
                socketSend = socketWatch.Accept();

                //将连接的客户端的ip地址和SocketSend存入 键值对集合中
                dicSocket.Add(socketSend.RemoteEndPoint.ToString(),socketSend);
                //客户端的ip地址存入下拉框
                cboUser.Items.Add(socketSend.RemoteEndPoint.ToString());
                //socketSend.RemoteEndPoint--返回连接客户端的IP地址
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功");
                //下拉框默认选中第一个
                cboUser.SelectedIndex = 0;

                //开启一个新线程来接收客户端发过来的消息
                Thread th = new Thread(Receive);
                th.IsBackground = true;
                th.Start(socketSend);
            }
            catch { }

        }
    }
    /// <summary>
    /// 不停的接收客户端发过来的消息
    /// </summary>
    /// <param name="obj"></param>
    void Receive(object obj)
    {
        Socket socketSend = obj as Socket;
        while (true)
        {
            try
            {
                //接收客户端发过来的消息
                byte[] buffer = new byte[1024 * 1024 * 2];
                //实际接收的数据r
                int r = socketSend.Receive(buffer);
                if (r == 0)
                {
                    //当r为0的时候表示用户下线,跳出接收循环
                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "已经下线");
                    break;
                }
                //将字节转换为字符
                string msg = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + msg);

                //将客户端的消息发回去
                SendMsg(msg);
            }
            catch { }
        }
    }
    /// <summary>
    /// 服务器向客户端发信息
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button4_Click(object sender, EventArgs e)
    {
        try
        {
            string msg = txtSend.Text.Trim();
            //打印到自己的控制台中
            ShowMsg("服务器:"+msg);
            //将消息发给对方
            SendMsg(msg);
        }
        catch { }
    }
    /// <summary>
    /// 服务器向客户端发信息
    /// </summary>
    void SendMsg(string msg)
    {
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
        List<byte> list = new List<byte>();
        list.Add(0);//表示发送的是文字
        list.AddRange(buffer);
        byte[] newBuffer = list.ToArray();
        //buffer=list.toArray()//不能这样赋值,因为长度不一
        //获得用户下拉框选中的ip地址
        //cboUser.SelectedIndex = 0;
        string ip = cboUser.SelectedItem.ToString();
        dicSocket[ip].Send(newBuffer);
        //socketSend.Send(buffer);
        txtSend.Text = ""; //清空发送栏
    }
    /// <summary>
    /// 打印文字到TextBox中
    /// </summary>
    /// <param name="str"></param>
    void ShowMsg(string str)
    {
        //之所以不是Text,防止覆盖
        txtLog.AppendText(str + "
");
    }
    /// <summary>
    /// 程序加载就取消跨线程访问
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form1_Load(object sender, EventArgs e)
    {
        Control.CheckForIllegalCrossThreadCalls = false;
    }
    /// <summary>
    /// 选择发送的文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "请选择你要发送的文件";
            ofd.Filter = "文件文件|*.txt|图片文件|*.jpg|全部文件|*.*";
            ofd.InitialDirectory = @"C:UsersAdministratorDesktop";
            ofd.ShowDialog();
            string path = ofd.FileName;
            txtPath.Text = path;//Path.GetFileName(path);
        }
        catch { }
    }
    /// <summary>
    /// 发送文件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button3_Click(object sender, EventArgs e)
    {
        try
        {
            //获得发送文件的路径
            string path = txtPath.Text;
            if (path == "")
            {
                return;
            }
            using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
            {
                byte[] buffer = new byte[1024 * 1024 * 100];
                int r = fsRead.Read(buffer, 0, buffer.Length);
                List<byte> listFile = new List<byte>();
                listFile.Add(1);//1表示发送的是文件
                listFile.AddRange(buffer);
                byte[] newBuffer = listFile.ToArray();
                dicSocket[cboUser.SelectedItem.ToString()].Send(newBuffer, 0, r+1, SocketFlags.None);
            }
        }
        catch { }
    }

    private void button5_Click(object sender, EventArgs e)
    {
        try
        {
            byte[] buffer = new byte[1];
            buffer[0] = 2;
            dicSocket[cboUser.SelectedItem.ToString()].Send(buffer);
        }
        catch { }

    }

    private void cboUser_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
}

}


解决方案三:

客户端Client
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    Socket socketSend;
    private void btnConnect_Click(object sender, EventArgs e)
    {
        try
        {
            //创建负责通信的Socket通信
            socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(txtIp.Text);
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
            ///服务器没有连接会抛异常
            //连接 ---获得要连接服务器的IP地址和端口
            socketSend.Connect(point);
            ShowMsg("连接成功");
            btnConnect.Enabled = false;
            //开启一个新的线程接收客户端发过的消息
            Thread th = new Thread(Receive);
            th.IsBackground = true;
            th.Start();
        }
        catch { }
    }
    /// <summary>
    /// 把消息显示到txtlog中
    /// </summary>
    /// <param name="str"></param>
    void ShowMsg(string str)
    {
        txtLog.AppendText(str+"
");
    }
    /// <summary>
    /// 客户端给服务端发送信息
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnSend_Click(object sender, EventArgs e)
    {
        try
        {
            string msg = txtSend.Text.Trim();
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
            socketSend.Send(buffer);
            //程序关闭应该提示下线
            txtSend.Text = "";//清空发送栏
        }
        catch { }
    }
    /// <summary>
    /// 不停的接收服务器发过来的消息
    /// </summary>
    void Receive()
    {
        while (true)
        {
            try
            {
                byte[] buffer = new byte[1024 * 1024 * 100];
                int r = socketSend.Receive(buffer);
                if (r == 0)
                {
                    break;
                }
                //判断 0表示的是发送文字消息,1表示文件,2表示震动
                if (buffer[0] == 0)
                {
                    string msg = Encoding.UTF8.GetString(buffer, 1, r-1);//(buffer, 0, r);
                    //判断是谁发过来的消息
                    string UserName = socketSend.RemoteEndPoint.ToString();
                    if (UserName == socketSend.RemoteEndPoint.ToString())
                    {

                    }

                    ShowMsg(UserName + ":" + msg);

                }
                else if (buffer[0] == 1)
                {
                    try
                    {
                        SaveFileDialog sfd = new SaveFileDialog();
                        sfd.Title = "请选择保存的路径";
                        sfd.Filter = "文本文件|*.txt|图片文件|*.jpg|全部文件|*.*";
                        sfd.InitialDirectory = @"C:UsersAdministratorDesktop";
                        sfd.ShowDialog(this);
                        //sfd.FileName表示接受过来的文件的路径-- 将接受的文件保存到桌面
                        string path = sfd.FileName;//@"C:UsersAdministratorDesktop";//sfd.fileName
                        if (path == "")
                        {
                            return;
                        }
                        using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
                        {
                            fsWrite.Write(buffer, 1, r - 1);
                        }
                        MessageBox.Show("保存成功");
                    }
                    catch{ }

                }
                else if (buffer[0] == 2)
                {
                    ZhenDong();
                }
            }
            catch { }
        }
    }
    /// <summary>
    /// 震动
    /// </summary>
    void ZhenDong()
    {
        for (int i = 0; i < 500; i++)
        {
            this.Location = new Point(400,100);
            this.Location = new Point(180,180);
        }
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        Control.CheckForIllegalCrossThreadCalls = false;

    }

解决方案四:

在C#中服务端如何获取客户端的IP地址、端口号以及客户端和服务器连接的时间

解决方案五:

不论是WIN7还是WIN10防火墙默认都是开的,除非你用的是网吧那种光盘做的系统,百度一下,如何windows添加端口访问规则

解决方案六:

另外一台电脑 telnet 192.168.X.XXX port,估计是无法连接,百度防火墙吧

时间: 2024-10-29 16:01:27

客户端与服务器-C#客户端为什么连接不上服务器,当ip地址为127.0.0.1是没有问题的的相关文章

在非SQL客户端使用命令行方式定期连接SQL Server服务器

在非SQL客户端使用命令行方式定期连接SQL Server 服务器并模拟用户查询操作,同时输出信息内容 一个很长的标题,实现的功能就是尽量使用非人力的方式模拟人去做一件事情,为了便于记录,将他们输出成文件方便查阅. 图形界面方式,使用微软自己的ConnMaker.exe,或者Microsoft 数据连接(系统自带,建立一个后缀为.udl的文件即可体验),进行可视化的操作. Figure 1使用ConnMaker.exe创建的可视化连接查询实例 不过这次用户的需求是因为他们在尝试进行连接到SQL服

mysql登陆总是错误,提示连接不上服务器

问题描述 mysql登陆总是错误,提示连接不上服务器 今天登陆mysql客户端的时候,总是提示这样的错误: "can't connect to MYSQL server on 'localhost' (10061)",尝试很多办法都不行,请问该怎么办?? 解决方案 看下你的mysql服务有没有启动起来. 如果有故障,参考:http://www.jb51.net/article/26505.htm 解决方案二: 贴一下连接语句 顺便确定连接的电脑的mysqld服务是开启的 解决方案三:

解决迅雷“暂时连接不上服务器”的问题

  今天用迅雷看看看电影,结果看了一半重启计算机后,再连接就出现"暂时连接不上服务器"的问题,但是看没看过的电影还是正常的,究竟怎么办呢? 我搜索了一下,发现有几个解决的方法: 1.打开运行,在运行里面输入一个如下命令语句:regsvr32 C:WINDOWSsystem32wmnetmgr.dll,再点击确定,若运行成功的话,会弹出一个对话框,提示成功,点击确定. 2.WMP播放器的问题,可以下载一个新的wmp10的播放器,重新安装,如果之前是wmp11的话,请卸载后,安装wmp10

p2p种子搜索器电驴连接不上服务器怎么办

  p2p种子搜索器电驴连接不上服务器怎么办?现在,不少人都在使用电驴这个p2p种子搜索器.有人就在问,电驴连接不上服务器怎么办?今天,小编就来跟大家分享电驴连接不上服务器解决办法,一起来看看吧. 步骤一:在电驴服务器界面右边的"从URL更新server.met"字样下边的小框里输入"http://upd.emule-security.org/server.met",然后点击"更新",下载新的服务器列表即可(使用的网址不要emule.org.cn

xmpp-IOS开发XMPP连接服务器问题,明显连接不上还不报错

问题描述 IOS开发XMPP连接服务器问题,明显连接不上还不报错 我最近在看学习与xmpp的即时通信有关的东西,在网上找到一个教程叫做"Building a Jabber Client for iOS: XMPP Setup",网址是http://code.tutsplus.com/tutorials/building-a-jabber-client-for-ios-xmpp-setup--mobile-7190 ,服务器是ejabbered.当我在xcode里面运行时,点击"

ksoap2-Ksoap2访问webservie 频繁使用导致手机连接不上服务器了,如何解决?

问题描述 Ksoap2访问webservie 频繁使用导致手机连接不上服务器了,如何解决? 数据量大约每次20条 每条200个字母 查询3次没问题,到第四次就连接不上了出现以下错误 求助老手 我有个小问题,android连接服务器 这种频繁的传输用json+webservies合适吗? 服务器是万网空间 03-09 23:50:14.778: E/AndroidRuntime(25277): java.lang.RuntimeException: Unable to start activity

sql-登录的时候连接不上服务器

问题描述 登录的时候连接不上服务器 tomcat报错 at java.lang.Thread.run(Thread.java:662) org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; Error: executeQueryForObject retu

android真机测试连接不上服务器

问题描述 android真机测试连接不上服务器 本人新手,按照网上的教程写socket通信 在模拟器上能够连接到服务器,但在真机上测试时始终连接不上,是什么情况啊??? 解决方案 从网上看到,基本上有着三种方法实现如题功能: (1)将应用后台服务器部署到某台可以通过公网访问的服务器上,手机访问该公网IP地址,类似于公网试用 (2)设置局域网,手机通过WIFI访问局域网中的某台服务器(拥有局域网IP地址) (3)Android的Internet传输功能 由于没有公网IP,所以方法一不可行,由于自己

tomcat-linux更改IP后,ejb连接不上了(配置文件ip已经改了)。

问题描述 linux更改IP后,ejb连接不上了(配置文件ip已经改了). linux更改IP后,ejb连接不上了.所有的配置文件都改了.jboss里的配置文件,tomcat项目里面的配置文件都改了.而且jboss和tomcat的缓存文件我都清理了.但是启动tomcat报以下错误:error creating bean with name 'tanma ' : invocation of init method failed nested exception is java.naming.nam