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();
}
}