Java Socket编程

 

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那样同时可以说同时可以听,可以一边说一边听,像打电话一样。

就不在这里列出了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ArrayList Threader = new ArrayList(); private static LinkedList Message_Array = new LinkedList(); private static int Thread_Counter = 0; private static boolean isClear = true; protected static final int SERVER_PORT = 10000; protected FileOutputStream LOG_FILE = new FileOutputStream( "d:/connect.log", true); public Server() throws FileNotFoundException, IOException { super(SERVER_PORT); // append connection log // Calendar now = Calendar.getInstance(); // String str = "[" + now.getTime().toString() + // "] Accepted a connection"; // byte[] tmp = str.getBytes(); // LOG_FILE.write(tmp); try { Socket socket = accept(); while (true) { new ServerReaderThread(socket); new ServerWriterThread(socket); } } finally { close(); } } public static void main(String[] args) throws IOException { new Server(); } // --- CreateServerThread class ServerReaderThread extends Thread { private Socket client; private BufferedReader in; private PrintWriter out; private String Username; public ServerReaderThread(Socket s) throws IOException { client = s; in = new BufferedReader(new InputStreamReader(client .getInputStream())); out = new PrintWriter(client.getOutputStream(), true); start(); } public void run() { try { int flag = 0; Thread_Counter++; String line = in.readLine(); while (!line.equals("bye")) { out.println(line); line = in.readLine(); } out.println("--- See you, bye! ---"); // System.out.println("--- See you, bye! ---"); client.close(); } catch (IOException e) { } finally { try { client.close(); } catch (IOException e) { } Thread_Counter--; } } } // --- CreateServerThread class ServerWriterThread extends Thread { priva

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值