趙雅智_java 網絡編程(2)之TCP – JAVA編程語言程序開發技術文章

TCP:客戶端服務端

服務端:

ServerSocket:編寫TCP網絡服務程序,首先要用到java.net.ServerSocket類用以創建服務器Socket

構造方法:

ServerSocket(int port):創建綁定到特定端口的服務器套接字
ServerSocket(int port, int backlog):利用指定的backlog(服務器忙時保持連接請求的等待客戶數量),創建服務器套接字並將其綁定到指定的本地端口號。
ServerSocket(int port, int backlog, InetAddress bindAddr):使用指定的端口、偵聽 backlog 和要綁定到的本地 IP 地址創建服務器。
常用方法:

Socket accept():偵聽並接受到此套接字的連接。
boolean isBound():返回 ServerSocket 的綁定狀態。
InetAddress getInetAddress():返回此服務器套接字的本地地址。
boolean isClosed():返回 ServerSocket 的關閉狀態。
void close():關閉此套接字。
void bind(SocketAddress endpoint):將ServerSocket 綁定到特定地址(IP 地址和端口號)。
客戶端:

Socket:客戶端要與服務器建立連接,必須先創建一個Socket對象

常用構造方法

Socket(String host, int port):創建一個流套接字並將其連接到指定主機上的指定端口號。
Socket(InetAddress address, int port):創建一個流套接字並將其連接到指定 IP 地址的指定端口號。
常用方法

InetAddress getInetAddress():返回套接字連接的地址。
int getPort():返回此套接字連接到的遠程端口。
InetAddress getlocalAddress():獲取套接字綁定的本地地址。
int getLocalPort():返回此套接字綁定到的本地
void close():返回此套接字的輸入流。
InputStream getInputStream():返回此套接字的輸入流。
OutputStream getOutputStream():返回此套接字的輸出流。
服務器端程序調用ServerSocket類中的accept()方法等待客戶端的連接請求,一旦accept()接收瞭客戶端連接請求,該方法返回一個與該客戶端建立瞭專線連接的Socket對象,不用程序去創建這個Socket對象。建立瞭連接的兩個Socket是以IO流的方式進行數據交換的,Java提供瞭Socket類中的getInputStream()返回Socket的輸入流對象,getOutputStream()返回Socket的輸出流對象。

先開服務端(service)在開客戶端(client)

否則會出現錯誤,如下:

 

 

實例1:客戶端與服務端

客戶端:

[java]
package src.com.hbsi.net; 
 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.Socket; 
 
public class TcpClient { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) throws Exception{ 
        //1.建立tcp客戶端socket,要確定要連接的服務器ip,port  
        Socket s=new Socket("192.168.49.59",9009); 
         
        //2.通過建立的socket,獲取輸出流對象  
        OutputStream out=s.getOutputStream(); 
         
        out.write("wo lai le".getBytes()); 
         
        //讀取服務器端發過來的信息  
        InputStream in=s.getInputStream(); 
         
        byte[] buf=new byte[1024]; 
         
        int len=in.read(buf); 
        System.out.println(new String(buf,0,len)); 
         
        s.close(); 
    } 
 

package src.com.hbsi.net;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TcpClient {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  //1.建立tcp客戶端socket,要確定要連接的服務器ip,port
  Socket s=new Socket("192.168.49.59",9009);
  
  //2.通過建立的socket,獲取輸出流對象
  OutputStream out=s.getOutputStream();
  
  out.write("wo lai le".getBytes());
  
  //讀取服務器端發過來的信息
  InputStream in=s.getInputStream();
  
  byte[] buf=new byte[1024];
  
  int len=in.read(buf);
  System.out.println(new String(buf,0,len));
  
  s.close();
 }

}

服務端

[java]
package src.com.hbsi.net; 
 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class TcpServer { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args)throws Exception { 
        //1.建立服務器socket  
         
        ServerSocket ss=new ServerSocket(9009); 
        //2.調用accept()  
        Socket s=ss.accept(); 
         
        String ip=s.getInetAddress().getHostAddress(); 
        System.out.println(ip+"…connection"); 
         
        InputStream in=s.getInputStream(); 
        byte[] buf=new byte[1024]; 
        int len=in.read(buf); 
         
        System.out.println(new String(buf,0,len)); 
         
        //服務端向客戶端返回信息  
        OutputStream out=s.getOutputStream(); 
        out.write("wo shou dao le".getBytes()); 
         
        s.close(); 
        ss.close(); 
         
         
 
    } 
 

package src.com.hbsi.net;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {

 /**
  * @param args
  */
 public static void main(String[] args)throws Exception {
  //1.建立服務器socket
  
  ServerSocket ss=new ServerSocket(9009);
  //2.調用accept()
  Socket s=ss.accept();
  
  String ip=s.getInetAddress().getHostAddress();
  System.out.println(ip+"…connection");
  
  InputStream in=s.getInputStream();
  byte[] buf=new byte[1024];
  int len=in.read(buf);
  
  System.out.println(new String(buf,0,len));
  
  //服務端向客戶端返回信息
  OutputStream out=s.getOutputStream();
  out.write("wo shou dao le".getBytes());
  
  s.close();
  ss.close();
  
  

 }

}
用CMD命令窗口打開:

 

 

實例2:可以從鍵盤錄入的客戶端和服務端

客戶端:

[java]
package src.com.hbsi.net; 
 
import java.net.Socket; 
import java.io.*; 
 
public class TcpClient2 { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) throws Exception{ 
         
        Socket s=new Socket("192.168.49.59",9009); 
        //獲取鍵盤錄入  
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
        //數據輸出給服務器端  
        OutputStream out=s.getOutputStream(); 
         
        BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(out)); 
        //獲取服務器端返回的數據  
        BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream())); 
         
        String line=null; 
         
        while((line=br.readLine())!=null){ 
            if(line.equals("over")) 
                break; 
             
            bwout.write(line); 
            bwout.newLine(); 
            bwout.flush(); 
             
            String str=brin.readLine(); 
            System.out.println("server:"+str); 
             
             
        } 
        br.close(); 
        s.close(); 
 
    } 
 

package src.com.hbsi.net;

import java.net.Socket;
import java.io.*;

public class TcpClient2 {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  
  Socket s=new Socket("192.168.49.59",9009);
  //獲取鍵盤錄入
  BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  //數據輸出給服務器端
  OutputStream out=s.getOutputStream();
  
  BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(out));
  //獲取服務器端返回的數據
  BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
  
  String line=null;
  
  while((line=br.readLine())!=null){
   if(line.equals("over"))
    break;
   
   bwout.write(line);
   bwout.newLine();
   bwout.flush();
   
   String str=brin.readLine();
   System.out.println("server:"+str);
   
   
  }
  br.close();
  s.close();

 }

}

服務端:

[java]
/*客戶端通過鍵盤錄入信息,發送到服務器端
服務器端收到信息後,將信息轉為大寫返回給客戶端。*/ 
 
 
 
package src.com.hbsi.net; 
 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class TcpServer2 { 
 
    /**
     * @param args
     */ 
    public static void main(String[] args) throws Exception{ 
        ServerSocket ss=new ServerSocket(9009); 
         
        Socket s=ss.accept(); 
         
        System.out.println(s.getInetAddress().getHostAddress()+"…connection"); 
        //讀取客戶的信息的輸入流  
        InputStream in=s.getInputStream(); 
         
        BufferedReader brin=new BufferedReader(new InputStreamReader(in)); 
        //向客戶端發送信息輸出流  
        BufferedWriter brout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
         
        String line=null; 
         
        while((line=brin.readLine())!=null){ 
            System.out.println("client:"+line); 
             
            brout.write(line.toUpperCase()); 
            brout.newLine(); 
            brout.flush(); 
             
        } 
        s.close(); 
        ss.close(); 
 
    } 
 

/*客戶端通過鍵盤錄入信息,發送到服務器端
服務器端收到信息後,將信息轉為大寫返回給客戶端。*/

 

package src.com.hbsi.net;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer2 {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  ServerSocket ss=new ServerSocket(9009);
  
  Socket s=ss.accept();
  
  System.out.println(s.getInetAddress().getHostAddress()+"…connection");
  //讀取客戶的信息的輸入流
  InputStream in=s.getInputStream();
  
  BufferedReader brin=new BufferedReader(new InputStreamReader(in));
  //向客戶端發送信息輸出流
  BufferedWriter brout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
  
  String line=null;
  
  while((line=brin.readLine())!=null){
   System.out.println("client:"+line);
   
   brout.write(line.toUpperCase());
   brout.newLine();
   brout.flush();
   
  }
  s.close();
  ss.close();

 }

}

 

發佈留言