public class SimpleSocket { public static void main(String[] args) { startServer(); } public static void startServer(int port){ try { //使用port端口创建服务器 ServerSocket ss = new ServerSocket(port); //获取链接服务器的客户端对象 Socket client = ss.accept(); //获取客户端输入输出流 InputStream is = client.getInputStream(); OutputStream os = client.getOutputStream(); String buf=""; while(true){ //读取一句话信息(一个字节一个字节的读取) int a = is.read(); while(a!=13){//遇到回车键,则判断为一句话 buf+=a; a = is.read(); } //此处得到的buf即为读取到的话 //向客户端发送信息("然后呢") os.write("然后呢".getBytes()); } } catch (IOException e) { e.printStackTrace(); } } }
一.服务器的简单实现
1.服务器 其实服务器的实现特别的简单,至少在java中是这样的。
ServerSocket server = new ServerSocket("4567");
这样就将一台电脑变成了一个服务器,并且将电脑上的4567端口做成了服务器的端口。说道这里呢就不得不说一说服务器端口了。
2.端口 无论是什么网络程序都得占用端口,包括QQ,浏览器(80),数据库(mysql:3306)等等,而一台电脑上一共有65535个端口,一个端口只能进行一个进程。也就是说,理论上一台电脑最多可以运行6万多个程序,呵呵,而实际上,那时候你的系统早就崩溃了,电脑是达不到那个水平的,至少我的电脑是这样的。注意,在我们编写程序的时候,最好不要使用1024以下的端口,因为很多系统程序是占用的这些端口,如果我们茫然使用,可能会带来跟多不必要的麻烦。例如,我们的浏览器占用的是80端口,你如果占用,有可能就不能浏览网页了。
3.网络通信,为什么叫网络通信,那就必须得通信,得有数据的流动和传输。这就必须使用到前面的流了。在通信里边也是一样,当我们建造了一个服务器,别人就能用telnet命令行登录咱们的服务器了,然而当别人访问我们的服务器时,是不会有反映的,因为我们没有对服务器做任何处理,所以就不能和客户端交流。
InputStream is = server.getInputStream(); OutputStream os = server.getOutputStream();
当我们写入这两句代码的时候,就已经获取了通信的输入输出流了。可以通过os给客户端发送信息,并可以通过is接收客户端发来的信息。
4.下面上服务器的简单代码,他实现了接收客户端的信息,并接收后给客户端发送“然后呢”(无论客户端发送什么都只给客户端回应这个话)。
上示:
二.客户端的简单实现 1.客户端与服务器一样。
Socket client = new Socket(IP, port);
就完成了连接服务器的工作,然后利用client获取客户端,得到输入输出流,然后传输数据。 2.下面上一段客户端的实现代码:
public class SimpleClient { public static void main(String[] args) { } public void startClient(String IP,int port){ try { //通过IP地址与端口链接服务器获取客户端信息 Socket client = new Socket(IP, port); //创建输入输出流 InputStream is = client.getInputStream(); OutputStream os = client.getOutputStream(); String buf =""; while(buf!="bye"){ //将缓存数组buf清空 buf=""; //从服务器读取数据 int a = is.read(); //不断读取,直到遇到回车键,则判断为一句话 while(a!=13){ buf+=a; a = is.read(); } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
可以看出,服务器与客户端基本上实现是一致的,并且我基本上都是在读取对方的信息,而并未放给对方实用的信息,我们可以在读取后加上一句“从当前键盘上读取数据,发送给对方”的操作就可以实现聊天功能。但这个功能有很多缺陷,首先这种两天只能是“你一句,我一句”我没说完你就不能说话,这显然是不符合实际要求的。然后这是服务器与客户端的聊天 ,我们前面说过,服务器只负责接受、处理并转发信息。所以我们应该是2个客户端之间的联系。最后,这个我们的服务器只能处理一个人的请求,并不能同时处理2个人的请求,比如:2个人同时连接我们的服务器,那就服务器就不能接受,所以我们得用线程去处理每一个客户端的请求,这样才能完成多人的聊天配置。
三.群聊
1.群聊的系统相对来说比较复杂,要比前面加起来的代码还要多很多。要考虑很多东西。但归根起来,也就是我上面提到的三条缺陷,当我们把这三条缺陷补充完整的时候,这个群聊模型就基本上出来了。在这里呢,我还是比较纠结的,因为如果把代码全部贴上去,那是很麻烦的,如果不呢,好像又说的不够完整。所以我将文件上传,可以自己研究研究。
四.题外话,基本上,聊天的处理已经完成,想必大家也对这个tcp的通讯过程有了一定的了解,在通讯之中,只要记住通讯的实质,也就是理论片中所提到的理论,通讯其实很简单,无处不在的感觉,此篇很粗糙,但是聊胜于无,实践实践,自己多捉摸才是硬道理。