零基础通信入门--实践篇

阅读更多
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的通讯过程有了一定的了解,在通讯之中,只要记住通讯的实质,也就是理论片中所提到的理论,通讯其实很简单,无处不在的感觉,此篇很粗糙,但是聊胜于无,实践实践,自己多捉摸才是硬道理。

  • 群聊.rar (3.4 KB)
  • 下载次数: 7

你可能感兴趣的:(socket,实践,通信,tcp)