浅出Java Socket编程

  出于多种目的要写这篇文章,简单的说是因为最近的工作和Java的Socket相关。所以工作之余就写了点的东西想法。同样我不希望把文章写的太复杂,因此简单出自己的一点心得。
  事实上网络编程简单的理解就是相对数值通讯下面。对于外汇交易平台来说,掌握一个计算机编程接口并使用一个编程模型相对外汇交易数据就可以的了。多了。Java SDK提供了一些相对简单的Api来完成这些工作。Socket就是其中之一。对于Java而言。这些Api存在于java.net这个包里面。因此只要导入这个包就可以进行网络编程了。
  网络编程的基本模型就是负载到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置。并去建立两个者之间的联系..然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器,而建立联系的通常称为客户端。基于这个简单的模型,就可以进入网络编程啦。
  Java对这个模型的支持有很多种Api。而这里我搭建介绍了有关Socket的Smashing接口。对于Java来说已经简化了Socket的Smashing接口。首先我们来讨论一下提供固定位置的服务方法是如何建立的.Java提供了ServerSocket来对其进行支持。事实上当你创建该类的一个实力对象并提供一个端口资源时你就创建了一个固定位置可以让其他计算机来访问你。ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip作为保留端口,所以你所分配的端口只能是1024个以后的。好了。我们有了固定位置。现在所需要的就是连接线了。该连接线由客户方首先提出要求。因此Java提供同样有了一个Socket对象来了就进行支持了。只要客户方创建一个Socket的实例对象进行支持就可以了.Socket client
  =new Socket(InetAddress.getLocalHost(),5678);客户端必须涉及服务器的IP地址。对于一点着Java也提供了一个相关的类InetAddress对象的实例必须通过它的静态方法来提供。它的静态方法提供了主要获得本机IP和通过名称或IP直接获得InetAddress的方法。好
  。上面的方法基本可以建立一条连线让计算机互相交流了。但是数据是如何传输的呢?事实上I/O操作总是和网络编程息息的,因为底层的网络是继续数据的。除非远程调用、处理问题的核心都在执行上。否则数据的交互还是依赖于I\O操作的。所以你也必须导入java.io这个包。java的IO也不操作复杂。它提供了针对字节流的操作和Unicode的读取器和写入器,还为数据读取器提供了缓冲。
  BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
  PrintWriter out=new PrintWriter(server.getOutputStream());
  上面两句就是建立缓冲并将原始的字节流转换为Unicode可以操作。而原始的字节流来源于Socket的两个方法.getInputStream()和getOutputStream()方。分别用来得到输入和输出。那么现在有了基本的模型和基本的操作工具。我们可以做一个简单的Socket实例程了。
  服务方:
  import java.io.*;
  导入java.net.*;
  公共类MyServer{
  公共静态void main(String[]args)抛出IOException{
  ServerSocket server=new ServerSocket(5678);}
  套接字客户端=服务器.accept();
  BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
  PrintWriter out=new PrintWriter(client.getOutputStream());
  while(true){
  String str=in.readLine();
  System.out.println(str);
  out.println("已收到......");
  出.flush();
  if(str.equals("end"))
  中断;
  }
  客户端.close();
  }
  }
  这个程序的主要目的是服务器不断接收负载所写入的信息只到。到消息.
  载体代码:
  import java.net.*;
  导入java.io.*;
  公共类客户端{
  静态套接字服务器;
  公共静态无效主(字符串[]args)抛出异常{
  服务器=新套接字(InetAddress.getLocalHost(),5678);
  BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
  PrintWriter out=new PrintWriter(server.getOutputStream());
  BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
  while(true){
  String str=wt.readLine();
  输出.println(str);
  出.flush();
  if(str.equals("end")){
  中断;
  System.out.println
  (in.readLine());
  }
  服务器.close();
  }
  }
  胸部代码接受客户键盘输入,并把该信息输出,然后“输出”用来做退出标志。
  这个程序只是简单的代替计算机之间的通讯。如果是多个客户同时访问一个服务器呢?你可以尝试再运行一个客户端,结果是会发送异常的。那么多个客户端如何实现呢?其实,简单
  的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身.而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时.服务器又使用这一根连线来后面通讯.那么既然如此只要我们存在多条连线就可以了.那么我们的程序可以如下:
  server:
  import java.io.*;
  导入java.net.*;
  公共类MyServer{
  公共静态void main(String[]args)抛出IOException{
  ServerSocket server=new ServerSocket(5678);}
  while(true){
  套接字客户端=server.accept();
  BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
  PrintWriter out=new PrintWriter(client.getOutputStream());
  while(true){
  String str=in.readLine();
  System.out.println(str);
  out.println("已收到......");
  出.flush();
  if(str.equals("end"))
  中断;
  }
  客户端.close();
  这个循环的目的就是当一个客户进来就为它分配一个Socket,直到这个客户完成一次和服务器的交互,这里就接受到客户的“
  结束
  ”
  消息。那么现在就实现了多客户之间的交互了。但是。问题又来了。这样做虽然解决了多客户,但是是排队执行的。一旦一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互。无法实现同时服务。那么要如何才能同时达到既能交互又能同时交流呢?很显然这是一个任务执行的问题了。所以线程是最好的解决方案方案。
  那么下面的问题是如何使用线程。首先要做的事情是创建线程并使其可以和网络连线取得联系。然后由线程来执行前面的操作。要创建线程或直接继承Thread或实现Runnable接口,要建立和Socket的联系只要传递引用就可以了。而要执行线程就必须重写run方法。而run方法做的事情。就是刚才单线程版本main做的事情。我们因此的程序就变成了了这样:
  import java.net.*;
  导入java.io.*;
  public class MultiUser extends Thread{
  私有Socket客户端;
  公共多用户(套接字c){
  this.client=c;
  }
  public void run(){
  try{
  BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
  PrintWriter out=new PrintWriter(client.getOutputStream());
  //多用户但不能并行
  while(true){
  String str=in.readLine();
  System.out.println(str);
  out.println("已收到......");
  出.flush();
  if(str.equals("end"))
  中断;
  }
  客户端.close();
  }catch(IOException ex){
  }finally{
  }
  }
  public static void main(String[]args)throws IOException{
  ServerSocket服务器=新ServerSocket(5678);
  while(true){
  //传输位置改变单用户或多用户
  MultiUser mu=new MultiUser(server.accept());
  mu.start();
  }
  }
  }
  我的类直接从Thread类继承。并且通过构造函数传递引用和ClientSocket建立了联系。这样每个线程都已经有了。一个通讯管道。同样可以填写run方法。把我们之前的操作交换线程来完成了。这些多客户端的Socket就建立起来了。
  我的文章写完了。虽然我的文章到这里就结束了。但是要和Java的Socket相关的操作还有很多。请各位大侠继续努力吧....