通过互联网赢得套接字和通信 [英] Win socket and communication over internet
问题描述
我开发了一个套接字程序,其中有一个聊天服务器和一个客户端。我在我的网络中测试这些应用程序,其中聊天服务器在计算机上运行,客户端正在另一台计算机上运行。当我运行客户端时,我只是给那台机器的IP
,其中聊天服务器正在运行。我的socket客户端可以通过IP与聊天服务器交互。如果我想通过互联网使用这个,那么告诉我如何设置。假设我的聊天服务器将在我们英国办事处的机器上运行,聊天客户端在我们的美国办事处运行
没有任何物理网络。如果我想通过互联网进行沟通,那么我需要做什么。请告诉我这样我可以设置我的聊天应用程序,因此他们可以通过互联网互相交谈.............谢谢。
i have developed a socket program where i have one chat server and one client. i test this apps in my network where chat server is running on a machine and client is running on another machine. when i run client then i just give the IP of that machine where chat server is running. my socket client can interact with chat server through IP. if i want use this over the internet then tell me how could i setup. suppose my chat server would run in a machine of our UK office and chat client run in our USA office there is no any physical network. if i want that communication should occur through internet then what i need to do. please tell me in such way i can setup my chat apps as a result they can talk to each other over the internet.............thanks.
推荐答案
查看此代码......它正是您想要的:
Check out this code... it exactly what you want:
客户:
使用System.IO;
使用System.Net;
使用System;
使用System.Threading;
使用N = System.Net;
使用System.Collections;
使用System.Windows.Forms;
使用System.ComponentModel;
使用System.Runtime.InteropServices;
类TalkUser {
 
静态表格谈话;
static N.Sockets.TcpClient TC;
[DllImport(" kernel32.dll")]
private static extern void ExitProcess(int a);
 
public static void Main(){
    talk = new Form();
    talk.Text =" TalkUser - OFFICIAL TalkServ Client" ;;
    talk.Closing + = new CancelEventHandler(talk_Closing);
    talk.Controls.Add(new TextBox());
    talk.Controls [0] .Dock = DockStyle.Fill;
    talk.Controls.Add(new TextBox());
    talk.Controls [1] .Dock = DockStyle.Bottom;
    ((TextBox)talk.Controls [0])。Multiline = true;
    ((TextBox)talk.Controls [1])。Multiline = true;
    talk.WindowState = FormWindowState.Maximized;
      talk.Show();
    ((TextBox)talk.Controls [1])。KeyUp + = new KeyEventHandler(key_up);
    TC = new N.Sockets.TcpClient();
    TC.Connect("IP OF A SERVER HERE",4296);
    线程t =新线程(新的ThreadStart(运行));
      t.Start();
    while(true){
          Application.DoEvents();
    }
}
 
private static void talk_Closing(object s,CancelEventArgs e){
    e.Cancel = false;
      Application.Exit();
      ExitProcess的(0);
}
 
private static void key_up(object s,KeyEventArgs e){
    TextBox TB =(TextBox)s;
    if(TB.Lines.Length> 1){
        StreamWriter SW = new StreamWriter(TC.GetStream());
          SW.WriteLine(TB.Text);
          SW.Flush();
        TB.Text ="" ;;
        TB.Lines = null;
    }
}
 
private static void run(){
    StreamReader SR = new StreamReader(TC.GetStream());
    while(true){
          Application.DoEvents();
        TextBox TB =(TextBox)talk.Controls [0];
          TB.AppendText(SR.ReadLine()+ QUOT; \r\\\
");
        TB.SelectionStart = TB.Text.Length;
    }
}
}
服务器:
使用System.IO;
使用System.Net;
使用System;
使用System.Threading;
使用N = System.Net;
使用System.Collections;
class TalkServ {
 
System.Net.Sockets.TcpListener服务器;
public static Hashtable句柄;
public static Hashtable handleByConnect;
 
public static void Main(){
    TalkServ TS = new TalkServ();
}
$
public TalkServ(){
    handles = new Hashtable(100);
    handleByConnect = new Hashtable(100);
    server = new System.Net.Sockets.TcpListener(4296);
    while(true){
          server.Start();
        if(server.Pending()){
            N.Sockets.TcpClient connection = server.AcceptTcpClient();
            Console.WriteLine(" Connection made");
            BackForth BF = new BackForth(连接);            
        }
    }
}
 
public static void SendToAll(string name,string msg){
    StreamWriter SW;
    ArrayList ToRemove = new ArrayList(0);
    N.Sockets.TcpClient [] tc = new N.Sockets.TcpClient [TalkServ.handles.Count];
      TalkServ.handles.Values.CopyTo(TC,0);
&NBSP; &NBSP; for(int i = 0; i< tc.Length; i ++){
&NBSP; &NBSP; &NBSP; &NBSP; 尝试{
&NBSP; &NBSP; &NBSP; &NBSP; if(msg.Trim()=="" || tc [i] == null)
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;继续;
&NBSP; &NBSP; &NBSP; &NBSP; SW = new StreamWriter(tc [i] .GetStream());
&NBSP; &NBSP; &NBSP; &NBSP; SW.WriteLine(name +":" + msg);
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SW.Flush();
&NBSP; &NBSP; &NBSP; &NBSP; SW = null;
&NBSP; &NBSP; &NBSP; &NBSP; } catch(例外e44){e44 = e44;
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; string g =(string)TalkServ.handleByConnect [tc [i]];
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; TalkServ.SendSysMsg(" **" + g +" ** HAS LEFT US。");
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; TalkServ.handles.Remove(克);
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; TalkServ.handleByConnect.Remove(TC [1]);
&NBSP; &NBSP; &NBSP; &NBSP; }
&NBSP; &NBSP; }
}
$
public static void SendSysMsg(string msg){
&NBSP; &NBSP; StreamWriter SW;
&NBSP; &NBSP; ArrayList ToRemove = new ArrayList(0);
&NBSP; &NBSP; N.Sockets.TcpClient [] tc = new N.Sockets.TcpClient [TalkServ.handles.Count];
&NBSP; &NBSP; &NBSP; TalkServ.handles.Values.CopyTo(TC,0);
&NBSP; &NBSP; for(int i = 0; i< tc.Length; i ++){
&NBSP; &NBSP; &NBSP; &NBSP; 尝试{
&NBSP; &NBSP; &NBSP; &NBSP; if(msg.Trim()=="" || tc [i] == null)
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;继续;
&NBSP; &NBSP; &NBSP; &NBSP; SW = new StreamWriter(tc [i] .GetStream());
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SW.WriteLine(MSG);
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; SW.Flush();
&NBSP; &NBSP; &NBSP; &NBSP; SW = null;
&NBSP; &NBSP; &NBSP; &NBSP; } catch(例外e44){e44 = e44;
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; TalkServ.handles.Remove(TalkServ.handleByConnect [TC [I]]);
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; TalkServ.handleByConnect.Remove(TC [1]);
&NBSP; &NBSP; &NBSP; &NBSP; }
&NBSP; &NBSP; }
}
} //课程结束TalkServ
class BackForth {
N.Sockets.TcpClient客户端;
System.IO.StreamReader SR;
System.IO.StreamWriter SW;
字符串句柄;
&NBSP;
public BackForth(System.Net.Sockets.TcpClient c){
&NBSP; &NBSP; client = c;
&NBSP; &NBSP; 线程t =新线程(新的ThreadStart(init));
&NBSP; &NBSP; &NBSP; t.Start();
}
&NBSP;
私人字符串GetHandle(){
&NBSP; &NBSP; SW.WriteLine("你的手柄是什么?");
&NBSP; &NBSP; &NBSP; SW.Flush();
&NBSP; &NBSP; 返回SR.ReadLine();
}
&NBSP;
private void run(){
&NBSP; &NBSP; 尝试{
&NBSP; &NBSP; string l ="" ;;
&NBSP; &NBSP; while(true){
&NBSP; &NBSP; &NBSP; &NBSP; l = SR.ReadLine();
&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; TalkServ.SendToAll(手柄,升);
&NBSP; &NBSP; }
&NBSP; &NBSP; } catch(例外e44){Console.WriteLine(e44); }¥b $ b }
&NBSP;
private void init(){
&NBSP; &NBSP; SR = new System.IO.StreamReader(client.GetStream());
&NBSP; &NBSP; SW = new System.IO.StreamWriter(client.GetStream());
&NBSP; &NBSP; SW.WriteLine("欢迎来到TalkServ!很好!");
&NBSP; &NBSP; // SW.WriteLine("你的手柄是什么?");
&NBSP; &NBSP; &NBSP; // SW.Flush();
&NBSP; &NBSP; handle = GetHandle();
&NBSP; &NBSP; while(TalkServ.handles.Contains(handle)){
&NBSP; &NBSP; &NBSP; &NBSP; SW.WriteLine(" ERR - Handle already exists!");
&NBSP; &NBSP; &NBSP; &NBSP; handle = GetHandle();
&NBSP; &NBSP; }
&NBSP; &NBSP; &NBSP; TalkServ.handles.Add(处理,客户端);
&NBSP; &NBSP; &NBSP; TalkServ.handleByConnect.Add(客户端,手柄);
&NBSP; &NBSP; TalkServ.SendSysMsg(" **" + handle +" ** HAS JOINED US。");
&NBSP; &NBSP; SW.WriteLine(" Now Talking ..... \\\\ ----------------------------- - ");
&NBSP; &NBSP; &NBSP; SW.Flush();
&NBSP; &NBSP; 线程t =新线程(新的ThreadStart(运行));
&NBSP; &NBSP; &NBSP; t.Start();
}
}
这篇关于通过互联网赢得套接字和通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!