`
lzkyo
  • 浏览: 466254 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TCP/IP协议(Socket)做服务器,HTTP协议做客户端

阅读更多

前几天在本区看到一个贴子,有人问,在Socket做服务器,在手机上用Http访问,如何实现。这个贴子,有十来个人回复了,可惜回复的都是:Socket使用TCP/IP协议,客户端用HTTP协议,不同协议不可能实现通讯。再可惜,那个贴子结了,要不然,我就可以回复了!在这里拿出来说一下,让大家不要再误会了(TCP/IP与HTTP不可通讯)  
  因为目前很多手机仍不支持MIDP2.0,只支持MIDP1.0,而Socket技术只在MIDP2.0才提供支持,所以,一般的Java   ME程序的如果要实现C/S结构,都会选用Tomcat等服务器、sevlet或JavaBean等Java   EE架构实现。不过,考虑到响应速度与性能的问题,Tomcat等Java   EE架构可能满足不了业务要求,这样,我们就要用到下面将要说的自已写服务器的技术了。        
  一般的C/S结构程序,一般程序员都会写,不过,这里一般程序员刚接触Socket写服务器,Http写客户端都会头大——不可能吧,Socket用TCP/IP协议,客户端用Http协议,不同协议间,怎么可能通讯呢!        
  本文要说的就是这个问题了。        
  大家一定都知道,网络系统一共分7层,在这七层中,Http协议要高于TCP/IP协议(因为在互联网中,计算机是通过IP定位的,也就是用TCP/IP协议了),对网络操作系统有了解的人,一定不会忘记,我们用Http访问www的时候,用的是域名,而域名,最终还是要通过DNS转换成IP地址的。这就对了——HTTP协议基于TCP/IP协议!而Socket正是基于TCP/IP协议,这样一来,它们就有了共同之外了!有了以上的认识,理论方面就没问题了。        
  我们再讨论一下实现:        
  服务器:        
  和一般的C/S结构一样,用Socket(java中用ServerSocket)监听。监听、读写消息的方面与一般的C/S服务器一模一样。不同的是,考虑到客户端只支持http协议,所以,读客户端消息的时候,读到的将是http头+消息,那么,我们便要用程序分析并去掉http头,只用消息。发消息的时候正好相反,在发送的消息前面,自己加上http头(其实就是一个包含一定内容的字符串),这样再发出去,客户端就可以收到并读取了。    
  客户端:        
  用Http连接,在java中,用的是HttpConnection.open("http://"+IP+":"+Port)访问服务器,这样,就可以向ServerSocket请求连接了。        
  在open之后,再向HttpConnection对象的输出流写入消息,然后刷新流再关闭HttpConnection就可以了,客户端因为本来用的就是http协议,所以不用自行加http头,底层会处理的;服务器在Accept()之后,就可以从Socket的输入流读到消息了。当然,如果要读服务器的消息的话,可以在HttpConnection关闭前读它的输入流(读的时候,如果还没有收到服务器消息,会阻塞当前线程的,直到读到为止,不怕读不到)。客户端读到的消息,是不包括http头的,所以,也就不用我们自行处理了。    
  要注意的是,HttpConnetion.open后,只能用一次,刷新后,它就无效了,得重新调用open方法再次建立连接。(服务器最好使用线程建立Socket与客户端连接,连接一次一个线程。)  

 

服务器示例代码:(共三个类)   
  //HttpServer.java   
  package   testnetserver;   
    
  public   class   HttpServer{   
  public   HttpServer()   {   
  }   
  public   static   void   main(String[]   aregs){   
  HttpServerSocket   hss=new   HttpServerSocket();   
  hss.start();   
  }   
  }   
    
    
    
    
    
    
  //HttpServerSocket.java   
  package   testnetserver;   
    
  import   java.net.ServerSocket;   
  import   java.io.*;   
    
  public   class   HttpServerSocket   extends   Thread{   
  ServerSocket   ss=null;   
  private   static   final   int   port=2222;   
  public   HttpServerSocket()   {   
  }   
  public   void   run(){   
  try   {   
  ss   =   new   ServerSocket(port);   
  }   
  catch   (IOException   ex)   {   
  System.out.println("ServerSocket   can   not   listen");   
  System.out.println("Error   on   ServerSocket   bind   port");   
  ex.printStackTrace();   
  ss=null;   
  return;   
  }   
  //循环监听   
  while(true){   
  HttpSocket   hs=null;   
  try   {   
  hs=new   HttpSocket();   
  hs.s=ss.accept();   
  System.out.println("have   a   client   connect");   
  hs.start();   
  }   
  catch   (IOException   ex1)   {   
  System.out.println("Error   on   accept");   
  }   
  }   
  }   
  }   
    
    
    
    
    
    
  //HttpSocket.java   
  package   testnetserver;   
    
  import   java.net.Socket;   
  import   java.io.*;   
    
  public   class   HttpSocket   
  extends   Thread   {   
  public   Socket   s   =   null;   
  String   msg   =   "";   
  public   HttpSocket()   {   
  }   
    
  public   void   run()   {   
  BufferedReader   is   =   null;   
  PrintWriter   os   =   null;   
  try   {   
  //由Socket对象得到输入流,并构造相应的BufferedReader对象   
  is   =   new   BufferedReader(new   InputStreamReader(s.getInputStream()));   
  //由Socket对象得到输出流,并构造PrintWriter对象   
  os   =   new   PrintWriter(s.getOutputStream());   
  }   
  catch   (IOException   ex)   {   
  System.out.println("Error   on   get   Buffere");   
  }   
    
  String   temp   =   "";   
  try   {   
  temp   =   is.readLine();   
  while   (temp   !=   null)   {   
  msg   +=   temp;   
  if   (temp.length()   >   4   &&   
  temp.substring(temp.length()   -   4).equals("/End"))   {   
  temp   =   is.readLine();   //虚读   
  temp   =   null;   
  break;   
  }   
  msg   +=   "\r\n";   
  temp   =   is.readLine();   
  }   
  getMsg();   
  //立刻回发消息   
  msg   =   "Begin/"   +   msg   +   "/End";   
  os.write("HTTP/1.1   200   OK\r\n");   
  os.write("Content-Type:   text;   charset=utf\r\n");   
  os.write(   ("Content-Length:   "   +   msg.length()   +   "\r\n"));   
  os.write("\r\n");   
  os.write(msg);   
  os.flush();   
  msg   =   "";   
  }   
  catch   (IOException   ex1)   {   
  System.out.println("Error   on   read   or   write   Buffered");   
  ex1.printStackTrace();   
  }   
  try   {   
  sleep(100);   
  }   
  catch   (InterruptedException   ex2)   {   
  System.out.println("Error   on   HttpSocket   sleep");   
  }   
  }   
    
  //去掉协议头,取出纯消息   
  private   void   getMsg()   {   
  int   begin   =   msg.indexOf("Begin/");   
  int   end   =   msg.indexOf("/End");   
  if   (begin   >=   0   &&   end   >   0   &&   msg.length()>"Begin/".length())   {   
  msg   =   msg.substring(begin   +   "Begin/".length(),   end);   
  System.out.println(msg);   
  }   
  else   {   
  msg   =   "";   
  }   
  }   
  }   

 

 

客户端示例代码(主要部份):   
  public   void   run()   {   
  HttpConnection   conn   =   null;   
  DataInputStream   dis   =   null;   
  DataOutputStream   dos   =   null;   
  int   begin   =   0,   end   =   0;   
  byte   temp[]   =   new   byte[10000];   
  int   len   =   0;   
  try   {   
  conn   =   (HttpConnection)   Connector.open("http://"   +   IP   +   ":"   +   
  port);   
                          //写输出流(向服务器发送信息)   
  dos   =   conn.openDataOutputStream();   
  msg   =   "Begin/"   +   msg+"/End";   
  //dos.writeUTF(msg);   
  dos.write(msg.getBytes());   
  dos.flush();   
  dos.close();   
  if   (!isTestConnectTime)   {   
  dataLenght   =   msg.length();   
  }   
  backTime   =   0;   
  //读输入流(读服务器消息)   
  dis   =   conn.openDataInputStream();   
  len   =   dis.read(temp);   
  if   (len   >   0)   {   
  receiveMsg   =   "";   
  for   (int   i   =   0;   i   <   len;   i++)   {   
  receiveMsg   +=   (char)   temp[i];   
  }   
  }   
    
  if   (receiveMsg.length()   >   0)   {   
  begin   =   receiveMsg.indexOf("Begin/");   
  end   =   receiveMsg.indexOf("/End");   
  if   (begin   >=   0   &&   end   >   0)   {   
  receiveMsg   =   receiveMsg.substring(begin   +   
  "Begin/".length(),   end);   
  if   (receiveMsg   !=   null   &&   receiveMsg.trim()   !=   ""   &&   
  receiveMsg.length()   >   0)   {   
  System.out.println(receiveMsg);   
  testCount++;   
  if   (!isTestConnectTime)   {   
  allDataLenght   +=   dataLenght;   
  }   
  }   
  }   
  }   
  //dos.close();   
  dis.close();   
  conn.close();   
  }   
  catch   (Exception   ex1)   {   
  System.out.println("Error   on   send   message");   
  ex1.printStackTrace();   
  }   
  }

 

分享到:
评论
1 楼 george_space 2011-07-29  
顶,非常好的文章。

相关推荐

    基于TCP/IP协议的Socket编程

    Java实现的Socket编程是基于TCP/IP协议的,它提供了一个可靠的数据流服务,可以实现客户端和服务器之间的数据交换。Java中的Socket类和ServerSocket类是两种基本的套接字类,Socket类用于建立客户端和服务器之间的...

    Socket服务端客户端以tcp/ip协议发送接收报文

    通过这种方式,Java Socket编程实现了基于TCP/IP协议的服务端和客户端通信。每个报文的发送和接收都依赖于`InputStream`和`OutputStream`对象,它们分别用于读取和写入网络数据。在实际应用中,可能需要对报文进行更...

    基于TCP/IP的socket编程

    为了实现这一功能,开发人员需要深入理解TCP/IP协议,熟练掌握socket编程接口,并具备处理异常和错误的能力。同时,还需要考虑安全性、性能优化以及资源管理等问题。在实际应用中,这样的设计可能会涉及并发处理,...

    基于C#的TCP/IP协议客户端和服务器的代码实现

    本文将深入探讨如何使用C#语言实现TCP/IP协议的客户端和服务器,通过理解并实践相关代码,可以提升C#开发者在网络编程上的技能。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它...

    基于TCP/IP的Socket多线程通信(服务器和客户端)

    在计算机网络编程中,TCP/IP协议族是连接网络应用的核心,而Socket是其接口,它提供了应用程序与网络通信的能力。本主题将深入探讨基于TCP/IP的Socket如何实现多线程通信,包括服务器端和客户端的设计与实现。 1. *...

    android studio Socket客户端服务器通信 TCP/IP通信

    android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信

    Java+TCP/IP+Socket编程++原书第2版.pdf

    本篇将深入探讨Java如何利用TCP/IP协议通过Socket进行网络编程。 TCP/IP协议族是一个分层的通信模型,包括应用层、传输层、网络层和数据链路层。在Java中,我们主要关注应用层的Socket接口和传输层的TCP协议。TCP是...

    TCP/IP协议socket编程。学习资料

    本学习资料专注于客户端和服务器端的Socket编程,旨在帮助你深入理解TCP/IP协议,并掌握如何通过Socket进行实际应用开发。 首先,TCP/IP协议族是互联网的核心,它由多个层次的协议组成,包括网络接口层(如ARP/RARP...

    ROS环境下TCP/IP客户端和服务器端C++程序

    首先,理解TCP/IP协议基础至关重要。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而IP(互联网协议)则负责网络层的数据包传输。结合两者,我们能在不同网络中建立稳定的数据传输...

    基于TCP/IP协议socket的文件传输,可以自己设置IP地址和端口,写入XML并读取其XML里的地址

    本话题主要探讨了如何利用Socket编程实现在TCP/IP协议基础上的文件传输,并结合MFC(Microsoft Foundation Classes)库以及XML(eXtensible Markup Language)进行数据的存储与读取。下面将详细介绍这些知识点。 ...

    基于TCP/IP协议的网络编程

    在IT行业中,网络编程是构建分布式系统和互联网应用程序的基础,而TCP/IP协议栈则是网络通信的核心。本主题将深入探讨“基于TCP/IP协议的网络编程”,特别是如何利用C++语言和Windows API函数来实现这一目标。 TCP...

    C#编写的TCP/IP通信程序,服务器和客户端

    本项目“C#编写的TCP/IP通信程序”就是基于C#的Socket编程实现的服务器和客户端示例,旨在帮助初学者理解和掌握TCP/IP通信的基本原理和编程技巧。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输...

    tcp/ip聊天室.rar

    在TCP/IP协议栈中,socket是应用程序与TCP/IP协议交互的接口。在这个聊天室项目中,开发者使用了socket来创建客户端和服务器端的连接,发送和接收聊天消息。 3. **多线程**:多线程技术在聊天室中至关重要,因为它...

    简单的Python示例,演示了如何使用TCP/IP协议进行基本的客户端和服务器通信

    简单的Python示例,演示了如何使用TCP/IP协议进行基本的客户端和服务器通信。 服务器端代码:tcp_server.py 客户端代码:tcp_client.py 服务器端运行日志: 等待连接... 已连接: ('127.0.0.1', 51610) 收到数据: ...

    C#使用SOCKET.rar_TCP/IP_socket_服务器_测试主站_联合开发

    TCP/IP协议栈是网络通信的基础,而Socket则是其在编程中的具体实现。本资料包“C#使用SOCKET.rar”着重介绍了如何在C#环境下利用TCP/IP Socket进行服务器和客户端之间的通信。 首先,TCP(Transmission Control ...

    基于局域网聊天程序设计其中网络通信部分采用流行的TCP/IP协议。程序采用典型的C/S(服务器/客户端)构架。用socket编程设计网络通讯

    其中网络通信部分采用流行的TCP/IP协议。程序采用典型的C/S(服务器/客户端)构架。用socket编程设计网络通讯。界面设计部分采用Windows MFC框架。数据库采用微软SQL Server。本文最终设计了一个简易版本的聊天软件,...

    TCP/IP协议编程

    本教程适合初学者,旨在深入浅出地介绍TCP/IP协议及其在编程中的应用,特别是通过socket进行网络通信的方法。 TCP(传输控制协议)和IP(互联网协议)是Internet上最核心的两个协议,构成了TCP/IP协议族的基础。TCP...

    聊天室代码 TCP/IP SOCKET 通信

    标题中的“聊天室代码 TCP/IP SOCKET 通信”指的是一个实现基于TCP/IP协议的网络聊天室应用,使用了SOCKET编程接口。在这个应用中,SOCKET是操作系统提供的接口,允许应用程序通过网络进行通信。TCP/IP是一种可靠的...

Global site tag (gtag.js) - Google Analytics