疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Socket通讯简单学习


 

  Socket通讯简单学习

  对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  (1) 创建Socket;

  (2) 打开连接到Socket的输入/出流;

  (3) 按照一定的协议对Socket进行读/写操作;

  (4) 关闭Socket.

  第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同

  在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。

  (1)下面是一个典型的创建客户端Socket的过程。

  try{

  Socket socket=new Socket("127.0.0.1",4700);

  //127.0.0.1是TCP/IP协议中默认的本机地址

  }catch(IOException e){

  System.out.println("Error:"+e);

  }

  (2)下面是一个典型的创建Server端ServerSocket的过程。

  ServerSocket server=null;

  try {

  server=new ServerSocket(4700);

  //创建一个ServerSocket在端口4700监听客户请求

  }catch(IOException e){

  System.out.println("can not listen to :"+e);

  }

  Socket socket=null;

  try {

  socket=server.accept();

  //accept()是一个阻塞的方法,一旦有客户请求,它就会返回一个Socket对象用于同客户进行交互

  }catch(IOException e){

  System.out.println("Error:"+e);

  }

  以上的程序是Server的典型工作模式,只不过在这里Server只能接收一个请求,接受完后Server就退出了。实际的应用中总是让它不停的循环接收,一旦有客户请求,Server总是会创建一个服务线程来服务新来的客户,而自己继续监听。程序中accept()是一个阻塞函数,所谓阻塞性方法就是说该方法被调用后,将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后accept()返回一个对应于客户的socket.这时,客户方和服务方都建立了用于通信的socket,接下来就是由各个socket分别打开各自的输入/输出流。

  我们了解了一下原理,下面可以着手编写

  服务端的编写

  Server.java

  package net;

  import java.net.*;

  import java.io.*;

  public class server {

  public static void main(String[] args)

  {

  ServerSocket ss=null;

  Socket s=null;

  try{

  ss=new ServerSocket(6000);//创建一个ServerSocket在端口监听客户请求

  s=ss.accept();//accept()是一个阻塞的方法,一旦有客户请求,它就会返回一个Socket对象用于同客户进行交互

  OutputStream os=s.getOutputStream();//获取输出流

  InputStream is=s.getInputStream();//获取出入流

  os.write("hello world".getBytes());//输出流向客户端发送数据

  //输入流从网络上读取数据

  byte[] buf=new byte[100];

  int length=is.read(buf);

  System.out.println(new String(buf,0,length) );

  os.close();//关闭输出流

  is.close();//关闭输入流

  s.close();关闭客户端

  ss.close();关闭服务端

  }

  catch(Exception e)

  {

  e.printStackTrace();

  }

  }

  }

  客户端的编写

  client.java

  package net;

  import java.net.*;

  import java.io.*;

  public class Client {

  public static void main(String[] args)

  {

  try{

  Socket s=new Socket(InetAddress.getByName(null),6000);

  //Socket s=new Socket("127.0.0.1",6000);//创建客户端套接子

  OutputStream os=s.getOutputStream();//获取输出流

  InputStream is=s.getInputStream();//获取输入流

  byte[]buf=new byte[100];

  int len=is.read(buf);

  System.out.println(new String(buf,0,len));

  os.write("hello ,this is fan".getBytes());

  os.close();

  is.close();

  s.close();

  }catch(Exception e)

  {

  e.printStackTrace();

  }

  }

  }

  我们先编译sever.java进行监听

  后编译client.java