Java Socket编程

来源:互联网 发布:演唱会门票制作软件 编辑:程序博客网 时间:2024/05/21 14:41
 

Socket

两个java应用程序可通过一个双向的网络通信连续实现数据交换,这个双向链路的一端称为一个Socket

 

Socket通常用来实现client-server连接。

 

Java.net包中定义的两个类socketServerSocket,分别用来实现双向连接的clientserver端(像qq那样,互相通信)。

 

建立连接时所需要的寻址信息为远程计算机的IP地址和端口号(port number)。

 

TCPSocket模型

 

 

过程

一个Server端多个Client

一端和另一段说话一端说一端听

server

import java.net.*;//一端和另外一端说话,一端说一端听。/* 1 java Socket编程步骤。 * 2 Socket/ServerSocker类用法。 * 3 通过Socket对象可以获取通信对方Socket的信息。 * */import java.io.*;public class  TestServer {         public static void main(String[] args)        {           try            {               //在服务器端建立自己的一个插座口。                 ServerSocket s = new ServerSocket(8888);              while(true)             {                    //接受来自客户端的请求。                       Socket s1 = s.accept();                    //写入到Client的管道(流)                       OutputStream os = s1.getOutputStream();                   //在管道上加上一层保障。也就是形成双层管道。                      DataOutputStream dos = new DataOutputStream(os);                 //和客户端通话,写入到客户端。                    //字符串hello ip地址,端口号。                    //客户端这样可以从服务器端读出了。                      dos.writeUTF("Hello" + s1.getInetAddress() + "port#" + s1.getPort()+ " bye-bye!");                        dos.close();                   s1.close();                }         }           catch(IOException e)          {                e.printStackTrace();              System.out.println("程序运行出错:" + e);           }      }  } getInetAddress()得到ip地址的超集,包含ip地址也可以包括其他的地址。.getPort() 得到端口号。server端写入到client端。


 

Client

Client端从server端读取

 

import java.net.*;import java.io.*; /*1 java Socket编程。 *2 Socket/ServerSocket类用法。 *3 通过Socket对象可以获取通信对方Socket信息。 */public class  TCPClient { public static void main(String[] args) {try{         //建立客户端的那个“插座接口”,并且通过构造方法和服务器端的那个接口相连接。           Socket s1 = new Socket("127.0.0.1",8888);        //读来自服务器端的数据流。           InputStream is = s1.getInputStream();       //DataInputStream 需要套接在InputStream上。         DataInputSteam dis = new DataInputStream(is);      //进行读出来自服务器端的数据流。通过UTF编码读出。        System.out.println(dis.readUTF());      //关闭管道。       dis.close();      //关闭socket接口通信。       s1.close();       }catch(ConnectException connExc)//捕捉到不同的异常进行不同的处理。       {          connExc.printStackTrace();        System.err.println("服务器链接失败!");         }catch(IOException e)     {             e.printStackTrace():      }  } } 


结果如下:

 

 

 

接通后两端都说都听

server

import java.net.*;//两端都说两端都听,但是要有顺序,这和当时的传呼机感觉类似。/* 1 java Socket编程步骤。 * 2 Socket/ServerSocker类用法。 * 3 通过Socket对象可以获取通信对方Socket的信息。 * */import java.io.*; public class  TestSocketServer {           public static void main(String[] args)            {                InputStream in = null;                OutputStream out = null;                try                {                    //在服务器端建立自己的一个插座口。                        ServerSocket ss = new ServerSocket(5888);                    //接受来自客户端的请求。                     Socket socket = ss.accept();                 //得到来自客户端写入的数据。                     in = socket.getInputStream();                //服务器端输出流对象。                    out = socket.getOutputStream();               //捆绑在两个管子上的传输管。                    DataOutputStream dos = new DataOutputStream(out);                 DataInputStream dis = new DataInputStream(in);               //定义从客户端读出的字符串。                 String s = null            //如果读出的不为空的话。向客户单发出本机的ip地址和连接的端口号。              if((s=dis.readUTF())!=null)             {                 System.out.println(s);                 System.out.println("from:" +socket.getInetAddress());                 System.out.println("port: " + socket.getPort());             }              //向客户端写入。                  dos.writeUTF("hi,hello");             //关闭流对象。                dis.close();             dos.close();             socket.close();          }              catch(IOException e)             {                 e.printStackTrace();                  System.out.println("程序运行出错:" + e);              }      } }


 

 Client端:

import java.net.*;import java.io.*; /*1 java Socket编程。 *2 Socket/ServerSocket类用法。 *3 通过Socket对象可以获取通信对方Socket信息。 */public class  TestSocketClient {           public static void main(String[] args)           {                 InputStream is = null;                 OutputStream os = null;                 try                 {                    //建立客户端的那个“插座接口”,并且通过构造方法和服务器端的那个接口相连接。                        Socket socket = new Socket("localhost",5888);                     is = socket.getInputStream();                     os = socket.getOutputStream();                     DataInputStream dis = new DataInputStream(is);                     DataOutputStream dos = new DataOutputStream(os);                  //写入.                 dos.writeUTF("hey");                 String s = null;                 if((s=dis.readUTF())!=null)                 {                          System.out.println(s);                  }                    dos.close();                    dis.close();                    socket.close();               }catch(UnknownHostException e)//捕捉到不同的异常进行不同的处理。               {                           e.printStackTrace();              }catch(IOException e)            {                     e.printStackTrace();              }        } }


 

 

点对点的通信

就像qq那样同时可以说同时可以听,可以一边说一边听,像打电话一样。

就不在这里列出了。

原创粉丝点击