JAVA Socket 编程

来源:互联网 发布:网页牛牛游戏源码 编辑:程序博客网 时间:2024/06/05 02:44

     java.net包主要用于进行网络处理、Socket通信、Cookie、URI等网络通信解决方案。

     今天主要抛块砖,对于网络编程这块内容进行一个简单的认知性总结。很浅显,网络编程大牛可绕过。

一、创建Socket客户端连接到服务器

try (Socket s=new Socket(host,port){InputStream inStream=s.getInputStream();Scanner in=new Scanner(inStream);while(in.hasNextLine()){String line=in.nextLine();System.out.println(line);}
1、创建一个Socket对象,传入主机名/ip,和端口号。

2、获取客户端的输入信息,进行扫描,将数据输出。

执行过程;
1、执行new Socket初始化,调用套接字构造器,打开一个套接字,启动程序内外的通信。传入主机和端口(String host,int port) 

2、getinputStream(返回一个inputStream对象)、getoutput 从套接字读取数据流,以及写出的数据流,可进行扫描输出等后续操作,这个就看具体业务需求。

      但是这种直接传入host 和port 的方式,对于一般Socket初始化,如果连接失败则会一直阻塞,直到连接到host为止。所以一般采用先建立一个无连接的套接字,再设置一个超时时间,如果在给定时间没有相应,则返回。

                Socket s=new Socket();s.connect(new InetSocketAddress(host,post),timeout);
      java隐藏了建立网络连接、发送数据的复杂过程,使得Socket类非常简单易用。

二、实现服务器

       客户端ok了,就可以创建一个简单的服务器,向客户端发送消息,启动后等待客户端连接到端口。

       //建立Socket服务器        try(ServerSocket s=new ServerSocket(1209))        {            try(Socket incoming=s.accept())//            {                InputStream inStream=incoming.getInputStream();                OutputStream outStream=incoming.getOutputStream();                try(Scanner in=new Scanner(inStream))                {                    PrintWriter out=new PrintWriter(outStream,true);                    out.println("hello ,I'm Max");                                        //将服务器输出返回给客户端作为输入                    boolean done=false;                    while(!done && in.hasNextLine())                    {                        String line=in.nextLine();                        out.println("client:"+line);                        if(line.trim().equals("h"))                            done=true;                    }                }            }
       SocketServer的accept方法作用在于告诉程序不停地等待直到有客户端连接到这个端口,有连接返回一个已经建立好的sock对象。然后可以根据这个socket对象获取它的输入输出流。服务器发送给服务器端的所有信息都会成会客户端获取的数据。

测试验证:

       首先打开telnet 功能,一个windows自带的用于远程连接功能。程序-window功能-选择telnet客户端。打开之后就支持在命令符窗口执行telnet命令。
什么是Telnet?
  对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具。一旦入侵者与远程主机建立了      Telnet连接,入侵者便可以使用目标主机上的软、硬件资源,而入侵者的本地机只相当于一个只有键盘和显示器的终端而已。
为什么需要telnet?
  telnet就是查看某个端口是否可访问。我们在搞开发的时候,经常要用的端口就是 8080。那么你可以启动服务器,用telnet 去查看这个端口是否可用。

详参见telnet 命令使用方法详解,telnet命令怎么用?

1、输入 telnet 127.0.0.1 1209  连接到创建好的服务器 ,如果连接失败,会提示拒绝连接。

2、连接成功后,进入telnet界面会输出程序中的Im Max 字符

3、回车,client后输入h,关闭连接。


三、多客户端支持

      当打开两个客户端,一个输出了数据,一个并没有。所以上边的服务器还仅限于对单客户端访问。利用多线程,稍微改造一下。

  class ThreadedEchoHandler implements Runnable  {          public ThreadedEchoHandler(Socket i)     {        incoming = i;    }    public void run()    {        try       {          try          {             InputStream inStream = incoming.getInputStream();             OutputStream outStream = incoming.getOutputStream();             Scanner in = new Scanner(inStream);             PrintWriter out = new PrintWriter(outStream, true );              out.println( "Hello!I m Max" );             boolean done = false;             while (!done && in.hasNextLine())             {                String line = in.nextLine();                out.println("client: " + line);                if (line.trim().equals("h"))                   done = true;              }          }          finally          {             incoming.close();          }       }catch(Exception e)        {       e.printStackTrace();        }    }    private Socket incoming; }public static void main(String[] args) throws IOException {//建立Socket服务器try{int i=1;ServerSocket s=new ServerSocket(1209);while(true){ Socket incoming=s.accept(); Runnable r = new ThreadedEchoHandler(incoming); Thread t = new Thread(r); t.start(); i++;}}catch(Exception e)        {       e.printStackTrace();        }}
         跟二中服务端的不同就在于创建了一个多线程类,用于执行不同的客户端访问任务。

四、总结

        Socket编程主要应用于网络通信,P2P通信中应用,在这方面基本笔者属于0开发经验,本文也纯属扫盲级应用。java web的开发中也对这方面有所应用,不过是封装好的,对一般开发不可见。

        另外,在维护一个数据传输项目中,有设计到Socket编程,当时是组内一个c++大牛写了一套实现,用于对大量数据进行接收、过滤,传送给上层服务。哎,反正,应该还比较重要,有时间可以研究一下。

0 0
原创粉丝点击