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

转载于:https://www.cnblogs.com/xingwu/p/3605018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值