C# winform如何将本机作为服务器运行聊天程序
客户端远程连接服务器时一般必须手动指明服务器的IP地址和端口号
而在服务器开启侦听服务侦听远程客户端连接时需指定端口号,IP地址可以由服务器内部程序自己获得
你下的这个客户端与服务器端程序中,在配置服务器时就是为客户端指定端口号与IP地址的,IP地址为你本机IP地址,端口号可以是0-65535之间的数,但大多数TCP/IP实现给临时端口分配1024~5000之间的端口号
比如你的IP地址是1921681819,端口号可以配置为8899
配置完成后启动服务器
那么在客户端连接时填入IP地址(1921681819)和端口号(8899)即可与服务器连接
有两个程序,一个是服务端程序,另一个是客户端程序。
服务端程序在本机运行,运行时应该会给出提示让你输入IP地址和端口号,一般IP地址不用输入,就是你的本机IP,端口号则要明确(如8899)。这个端口号是你自己随意设定的,只要不冲突就行。
输入完成后启动服务端程序运行服务器。
然后你运行客户端程序,它也应该有输入框让你输入远程服务端程序的IP地址和端口号(正常的程序应该会这样),就是你在运行服务端程序时设置的IP地址和端口号。你同样可以在本机运行客户端,IP地址输入127001,端口号8899,确定即可。
如果你不知道本机的外网地址,可以登录一些特定的网址查询网站,进入后可以自动检测你的外网地址
用易语言的服务器组件和客户端组件是可以做的 但是 你的机子要24小时开机很不好 租个服务器吧 这样简单
或者你和你的朋友说好 一天什么时候到什么时候使用也可以。 这个时候你就要个花生壳来固定你的IP ,有路由器的要映射到你的内网IP ,然后你朋友用客户端组件连接你的服务器组件。
花生壳是实现域名动态解析的你可以在网上找下使用教程但不建议你用个人电脑来当服务器用一方面是家里的通风运行环境设备设施等各方面的条件不如IDC机房另一方面这种应用本身对带宽的要求较高你自己在家里拉大带宽的成本比你租用服务器还要高再涉及到备案的问题目前网站在国内放域名是需要备案的而备案必须由接入商协助你提交所以综合多方面的因素考虑还是建议你选择IDC公司租用一台服务器比较划算如果前期规模不大的情况下用普通配置100M共享带宽即可满足这样一台服务器根据你所选择线路的不同从四五千每年到七八千每年不等
简单的说就是C/S结构的网络软件。客户端装在移动平台或PC上,服务端则要安装在服务器上。
服务器一般租赁或自行租用宽带架设。服务端软件起到管理客户端和传递信息的作用。后台数据库则视用户数量的多少和传递数据的多少来决定采用何种数据库。
不同的服务器操作系统,也需要开发人员开发相对应的服务端软件。
服务器端(注意要先启动服务器端)
import javaio;
import javanet;
import javaawt;
import javaawtevent;
public class server extends Frame implements ActionListener {
Label label = new Label("交谈内容");
Panel panel = new Panel();
TextField tf = new TextField(10);
TextArea ta = new TextArea();
ServerSocket server;
Socket client;
InputStream in;
OutputStream out;
public server() {
super("服务器");
setSize(250, 250);
paneladd(label);
paneladd(tf);
tfaddActionListener(this);
add("North", panel);
add("Center", ta);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Systemexit(0);
}
});
show();
try {
server = new ServerSocket(4000);
client = serveraccept();
taappend("客户机是:" + clientgetInetAddress()getHostName() + "\n\n");
in =clientgetInputStream();
out= clientgetOutputStream();
} catch (IOException ioe) {
}
while (true) {
try {
byte[] buf = new byte[256];
inread(buf);
String str = new String(buf);
taappend("客户机说:" + str + "\n\n");
} catch (IOException e) {
}
}
}
public void actionPerformed(ActionEvent e) {
try {
String str = tfgetText();
byte[] buf = strgetBytes();
tfsetText(null);
outwrite(buf);
taappend("我说:" + str + "\n");
} catch (IOException ioe) {
}
}
public static void main(String[] args) {
new server();
}
}
客户端
import javaio;
import javanet;
import javaawt;
import javaawtevent;
public class client extends Frame implements ActionListener {
Label label = new Label("交谈内容");
Panel panel = new Panel();
TextField tf = new TextField(10);
TextArea ta = new TextArea();
Socket client;
InputStream in;
OutputStream out;
public client() {
super("客户机");
setSize(250, 250);
paneladd(label);
paneladd(tf);
tfaddActionListener(this);
add("North", panel);
add("Center", ta);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Systemexit(0);
}
});
show();
try {
client = new Socket(InetAddressgetLocalHost(), 4000);
taappend("服务器是:" + clientgetInetAddress()getHostName() + "\n\n");
in = clientgetInputStream();
out = clientgetOutputStream();
} catch (IOException ioe) {
}
while (true) {
try {
byte[] buf = new byte[256];
inread(buf);
String str = new String(buf);
taappend("服务器说:" + str + "\n");
} catch (IOException e) {
}
}
}
public void actionPerformed(ActionEvent e) {
try {
String str = tfgetText();
byte[] buf = strgetBytes();
tfsetText(null);
outwrite(buf);
taappend("我说:" + str + "\n");
} catch (IOException iOE) {
}
}
public static void main(String args[]) {
new client();
}
}
这个只能在自己一台电脑上先启动服务器再启动客户端才行,要想一台机子启动服务器端一台机子启动客户端需要把客户端的 client = new Socket(InetAddressgetLocalHost(), 4000);改成 client = new Socket("服务器Ip", 4000);(前提是两台机子连在局域网里面的)
Java可以使用Socket编程实现聊天功能。Socket是一种网络通信协议,它可以在不同的主机之间传输数据。在聊天功能中,一般有客户端和服务器两个角色。
客户端是发送消息的一方,它需要创建一个Socket对象,指定要连接的服务器的IP地址和端口号。然后,客户端通过Socket对象的输入输出流向服务器发送和接收消息。在接收消息时,客户端需要启动一个线程不断监听服务器的消息,并将接收到的消息展示给用户。
服务器端则是接收和转发消息的一方。服务器需要创建一个ServerSocket对象,指定监听的端口号。当有客户端连接到服务器时,服务器通过Socket对象的输入输出流向客户端发送和接收消息。在接收到客户端的消息后,服务器需要将消息转发给其他客户端,以实现聊天室的功能。
需要注意的是,在聊天功能中,数据的传输是通过网络进行的,因此需要考虑数据传输的稳定性和安全性。例如,可以使用加密算法对聊天数据进行加密,确保聊天数据的安全性。此外,在多用户同时连接的情况下,还需要考虑服务器的并发处理能力。
聊天具体是这么聊,聊天室、群聊、一对一。java其实websocket足矣,ws服务器部署起来,客户端程序连接ws服务器服务,用服务器转发作为消息传输机制,当然你要大文件传输和视频通话就用socket转发连接,p2p通信,这里的p2pjava因为都是服务器部署,不需要做外网打洞穿透,因为web服务器他是本地环境,明白不。你用windows应用程序就需要外网穿透打洞,你不可能视频数据也让服务器转发吧,聊天人数越来越多,服务器承受不了,它需要服务器指派点对点单向传输,不去途径服务器。
1首先你要进一步明确你要做什么?
网络聊天室,是网页聊天?电脑软件聊天?移动app聊天?
2然后你要明白你可以做到什么?
你会编程吗?java,php,C++,C#,你会?那就可以开始设计程序的思路了。你不会?你就可以网上找源码学习自己部署源码项目了。
3进一步你要知道你怎么可以做好。
服务端环境怎么搭建,服务器用什么系统,源码是不是有bug和漏洞,搭建好了客户端怎么连接,运行起来了怎么保证稳定性。
4什么?你有钱?而且很多。
差不多几十万可以直接让别人帮你搞定,还有余钱招人运维。猪八戒或者直接线下联系软件公司就好。
5什么?你没钱?
那么老老实实参考上述三条,让你或者你的团队自学搞定。不会编程也得会部署已经有的源码,不会服务器就赶紧了解就学,网上的聊天程序一大堆,安装说明文档,和各种知识也很多,基本上看教程照着来就行,如果你这都搞不定?
那就没办法了
如下:
该软件采用P2P方式,各个客户端之间直接发消息进行会话聊天,服务器在其中只扮演协调者的角色(混合型P2P)。
1会话流程设计
当一个新用户通过自己的客户端登陆系统后,从服务器获取当前在线的用户信息列表,列表信息包括了系统中每个用户的地址。用户就可以开始独立工作,自主地向其他用户发送消息,而不经过服务器。每当有新用户加入或在线用户退出时,服务器都会及时发消息通知系统中的所有其他用户,以便它们实时地更新用户信息列表。
按照上述思路,设计系统会话流程如下:
(1)用户通过客户端进入系统,向服务器发出消息,请求登陆。
(2)服务器收到请求后,向客户端返回应答消息,表示同意接受该用户加入,并顺带将自己服务线程所在的监听端口号告诉用户。
(3)客户端按照服务器应答中给出的端口号与服务器建立稳定的连接。
(4)服务器通过该连接将当前在线用户的列表信息传给新加入的客户端。
(5)客户端获得了在线用户列表,就可以独立自主地与在线的其他用户通信了。
(6)当用户退出系统时要及时地通知服务器。
2用户管理
系统中,无论是服务器还是客户端都保存一份在线用户列表,客户端的用户表在一开始登陆时从服务器索取获得。在程序运行的过程中,服务器负责实时地将系统内用户的变动情况及时地通知在线的每个成员用户。
新用户登录时,服务器将用户表传给他,同时向系统内每个成员广播“login”消息,各成员收到后更新自己的用户表。
同样,在有用户退出系统时,服务器也会及时地将这一消息传给各个用户,当然这也就要求每个用户在自己想要退出之前,必须要先告诉服务器。
3协议设计
31客户端与服务器会话
(1)登陆过程。
客户端用匿名UDP向服务器发送消息:
login,username,localIPEndPoint
消息内容包括3个字段,各字段之间用“,”分隔:“login”表示请求登陆;“username”为用户名;“localIPEndPoint”是客户端本地地址。
服务器收到后以匿名UDP返回如下消息:
Accept,port
其中,“Accept”表示服务器接受了请求;“port”是服务所在端口,服务线程在这个端口上监听可能的客户连接,该连接使用同步的TCP。
连上服务器,获取用户列表:
客户端从上一会话的“port”字段的值服务所在端口,于是向端口发起TCP连接,向服务器索取在线的用户列表,服务器接受连接后将用户列别传输给客户端。
用户列表格式如下:
username1,IPEndPoint1;username2,IPEndPoint2;;end
username1,username2为用户名,IPEndPoint1,IPEndPoint2为它们对应的端点。每个用户的信息都有个“用户名+端点”组成,用户信息之间以“;”隔开,整个用户列表以“end”结尾。
31服务器协调管理用户
(1)新用户加入通知。
由于系统中已存在的每个用户都有一份当前用户表,因此当有新成员加入时,服务器无需重复给系统中的每个成员再传送用户表,只要将新加入成员的信息告诉系统内的其他用户,再由他们各自更新自己的用户表就行了。
服务器向系统内用户广播发送如下消息:
端点字段写为“remoteIPEndPoint”,表示是远程某个用户终端登陆了,本地客户线程据此更新用户列表。其实,在这个过程中,服务器只是将受到的“login”消息简单地转发而已。
(2)用户退出。
与新成员加入时一样,服务器将用户退出的消息直接进行广播转发:
logout,username,remoteIPEndPoint
其中,“remoteIPEndPoint”为退出系统的远程用户终端的端点地址。
31用户终端之间聊天
用户聊天时,他们各自的客户端之间是以P2P方式工作的,彼此地位对等,独立,不与服务器发生直接联系。
4系统实现
41服务线程
系统运行后,先有服务器启动服务线程,只需单击“启动”按钮即可。
即时聊天软件可以在两名或多名用户之间传递即时消息的网络软件,大部分的即时聊天软件都可以显示联络人名单,并能显示联络人是否在线。使用者发出的每一句话都回即时显示在双方的萤幕上。
0条评论