您的位置:首页 > 编程语言 > Java开发

Java Socket编程

2013-04-17 13:24 267 查看
Socket
两个java应用程序可通过一个双向的网络通信连续实现数据交换,这个双向链路的一端称为一个Socket。

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

Java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端(像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那样同时可以说同时可以听,可以一边说一边听,像打电话一样。
就不在这里列出了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: