`
daideshun
  • 浏览: 6293 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java Socket网络编程

 
阅读更多
 
     要进行网络编程,必然要先了解计算机网络通讯的一些基本原理,网络通讯也是一个整体的系统。不了解整个系统是如何运转的又怎么才能很好的理解系统部分设计的合理性呢?现在的网络体系结构基本上都是基于OSI模型的,自顶向下大概分为五层,即应用层、运输层、网络层、链路层、物理层等,但在实际的应用编程中,我们往往接触的只是网络的应用层。其中应用层提供了各种应用于网络数据传输的服务,以此来保障通信的准确无误。所以开发者制定了一系列的通信协议来提供通信服务,其中比较重要的有UDP和TCP;TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

   UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快,


   总之,在面对什么样的问题时,合适的选择相应的协议。对于计算机网络仅仅了解这些是不够的,以后多看看《计算机网络通信自顶向下方法》这本书,以便更好的了解网络通信世界。



  到这里是不是觉得网络编程这么麻烦呢?答案当然不是,要是每个开发人员都要认真走一遍计算机网络的所有知识的话,这简直要疯了。通信的成本这么高,所以我们一方面要能做出让客户耳目一新的产品之外,同时在保证产品质量和用户体验的同时,也要降低开发成本,其实这两者有事一对矛盾体,有效的解决矛盾的统一性问题,才能使事物达到和谐快速的发展。我们建设社会主义不也是这样吗?高举中国特色社会主义的伟大旗帜,解决国内各种矛盾争端,解放生产力。所以在这个伟大的时代封口浪尖中诞生Socket这玩意。

何为Socket ?
  
  Socket 是一个对象,是代表两台机器之间网络连接的对象(java.net.Socket)。很形象一点的说法就相当于我们平时打电话的那根电话线。学术一点,所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
下面具体的列出网络通信的一般步骤做法:

1.通信前要定好通信协议,即应用程序如何和服务器进行会话,严格按照制定的协议进行读取、和发送消息,已达到预期的设计目的、或者服务。


2.创建服务端

// 1.创建一个SercerSocket,使用6666端口监听客户端请求
ServerSocket serverSocket =newServerSocket(6666);
System.out.println("The server is started, listening on port  6666");

  while(true)
     {
  // 2.ServerSocket的accept()在等待用户连接的时候闲置;在用户连接上来的时候, 返回一个Socket来与客户端通信
      Socket socket = serverSocket.accept();  //等待客户连接,            阻塞...............
  // 3.创建PrintWriter对象,用以接收socket输出流
     PrintWriter writer =newPrintWriter(socket.getOutputStream());

// 4.使用PrintWriter对象写出输出数据

     String advice ="notifier's blog";
       writer.println(advice);   //按照事先制定好的协议发送消息

         // 5. 关闭连接
          writer.close();
}



3 客户端编程:

// 1.创建Socket连接,告知Server的IP地址以及端口号
Socket socket =newSocket("127.0.0.1",6666);

// 2.创建InputStreamReader,用于读取socket输入流

InputStreamReader stream =newInputStreamReader(socket.getInputStream());
// 3.使用BufferedReader链接输入流
BufferedReader br =newBufferedReader(stream);
// 4.读出数据,这里只是一个简单的实列,具体还要根据具体的协议进行收发消息
String line =null;


  while((line = br.readLine()) !=null)
      {
          System.out.println("Today's advice is: "+ line);
      }
  // 5. 关闭输入流BufferedReader
           br.close();

  就这样只要稍加整理,一简单的Server-Client模型的程序就写好了,但是这个程序写出来达到我们的目的了吗?显然没有,这能作为初学者调试用,只能说没有达到我们的终极目标,革命尚未成功,同志还需努力。以上的程序最大的弊病就是只能实现一对一的通信,虽然能连接多个客户,但只有一个客服来提供服务,显然不行,会发生错乱。这时候我们就要想了,怎么才能设计出每一个客户对应一个客服呢?答案是坑定的,这就要我们学会用多线程的编程方法,解决并发的问题。多说无益下面给出来多线程处理的代码过程(代码只是一些过程化的描述,并非调试好的代码):
  
public class MyQqServer  {

	ObjectInputStream ois;
	ObjectOutputStream oos;
	boolean isLogin = false;
	ShowUI ui ;
	
	public MyQqServer()
	{
		 ui = new ShowUI();
		 
		try {
			
			ServerSocket ss=new ServerSocket(9988);  
			ui.showProcess.append("服务器已成功启动!正在监听用户的登陆....\r\n");
			
		while(true)
			{
			Socket socket=ss.accept();     //阻塞,等待连接
			//当有客户连接到服务器时,就启动一个线程来处理消息收发。
	SerConClientThread  st = new SerConClientThread (socket);
           st.start();					
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}finally{
			
		}
	}



public class SerConClientThread  extends Thread{

	Socket s;
	
	public SerConClientThread(Socket s)
	{
		   this.s=s;
        }
	
	public void run(){
	
while(true)
	{
			
	//这里该线程就可以接收客户端的信息.
	try {
		//获取socket的输入流
 		Message m=(Message)ois.readObject();             
                //判断消息的类型,并根据原先制定好的协议,做出相应的反映      			
		} catch (Exception e) {
				e.printStackTrace();
				// TODO: handle exception
			}		
		}
			
	}

     
     有了这些基本的技术点,再借助以前我们学过的知识,我们可以开发网络小应用了,类似于QQ的聊天、网络五子棋、象棋等,和通信相关的应用你是否都已用思路了呢?虽然说这些东西很多人都能做出来,作为我们初学者来说要设计出什么创新很强的应用,可能一下还做不到,但你一定要理解原理,通过练习来达到熟练的程度,我辈并非人人都有得天独厚的慧资,能创造出史无前例、绝无仅有的新事物来,但一定不要和别人做的一样,否者这样就失去了自己,做设计除了练习阶段外,设计出来的东西不说能让别人激动,得先让你自己激动。这样你就能拥有永恒不竭的激情去燃烧设计者的思想和灵魂。让更多的人因你而激动。

    在下一片技术博客中,会进一步会结合网络小项目详细的阐述网络编程的一些细节,包括数据的打包、解包、设计模式框架,怎么运用这些技术点实现多人聊天、玩游戏的功能。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics