public class TCPEchoServer {
private static final int BUFSIZE = 32;
/**
* @param args
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// 從控制臺(tái)獲取需要監(jiān)聽的端口號(hào)
if (args.length != 1)
throw new IllegalArgumentException("Parameter(s):<Port>");
// 獲取端口號(hào)
int servPort = Integer.parseInt(args[0]);
// 實(shí)例化一個(gè)ServerSocket對(duì)象實(shí)例
ServerSocket servSocket = new ServerSocket(servPort);
System.out.println(MessageFormat.format("開始啟動(dòng)監(jiān)聽扩所,端口號(hào):{0}", args[0]));
// 初始接收數(shù)據(jù)的總字節(jié)數(shù)
int recvMsgSize;
// 接收數(shù)據(jù)的緩沖區(qū)
byte[] receiveBuf = new byte[BUFSIZE];
// 循環(huán)迭代围详,監(jiān)聽端口號(hào),處理新的連接請(qǐng)求
while (true) {
// 阻塞等待,每接收到一個(gè)請(qǐng)求就創(chuàng)建一個(gè)新的連接實(shí)例
Socket clntSocket = servSocket.accept();
// 獲取連接的客戶端的 SocketAddress
SocketAddress clientAddress = clntSocket.getRemoteSocketAddress();
// 打印輸出連接客戶端地址信息
System.out.println("Handling client at" + clientAddress);
// 從客戶端接收數(shù)據(jù)的對(duì)象
InputStream in = clntSocket.getInputStream();
// 向客戶端發(fā)送數(shù)據(jù)的對(duì)象
OutputStream out = clntSocket.getOutputStream();
// 讀取客戶端發(fā)送的數(shù)據(jù)后祖屏,再發(fā)送到客戶端
while ((recvMsgSize = in.read(receiveBuf)) != -1) {
out.write(receiveBuf, 0, recvMsgSize);
}
// 客戶端關(guān)閉連接時(shí)助赞,關(guān)閉連接
System.out.println(" 客戶端關(guān)閉連接");
clntSocket.close();
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
public class TCPEchoClient {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// 判斷從控制臺(tái)接受的參數(shù)是否正確
if ((args.length < 2) || (args.length > 3))
throw new IllegalArgumentException("Parameter(s):<Server><Word>[<Port>]]");
// 獲取服務(wù)器地址
String server = args[0];
// 獲取需要發(fā)送的信息
byte[] data = args[1].getBytes();
// 如果有三個(gè)從參數(shù)那么就獲取發(fā)送信息的端口號(hào),默認(rèn)端口號(hào)為8099
int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 8099;
// 根據(jù)服務(wù)器地址和端口號(hào)實(shí)例化一個(gè)Socket實(shí)例
Socket socket = new Socket(server, servPort);
System.out.println("Connected to server...sending echo string");
// 返回此套接字的輸入流袁勺,即從服務(wù)器接受的數(shù)據(jù)對(duì)象
InputStream in = socket.getInputStream();
// 返回此套接字的輸出流雹食,即向服務(wù)器發(fā)送的數(shù)據(jù)對(duì)象
OutputStream out = socket.getOutputStream();
// 向服務(wù)器發(fā)送從控制臺(tái)接收的數(shù)據(jù)
out.write(data);
// 接收數(shù)據(jù)的計(jì)數(shù)器,將寫入數(shù)據(jù)的初始偏移量
int totalBytesRcvd = 0;
// 初始化接收數(shù)據(jù)的總字節(jié)數(shù)
int bytesRcvd;
while (totalBytesRcvd < data.length) {
// 服務(wù)器關(guān)閉連接期丰,則返回 -1,read方法返回接收數(shù)據(jù)的總字節(jié)數(shù)
if ((bytesRcvd = in.read(data, totalBytesRcvd, data.length - totalBytesRcvd)) == -1)
throw new SocketException("與服務(wù)器的連接已關(guān)閉");
totalBytesRcvd += bytesRcvd;
}
// 打印服務(wù)器發(fā)送來的數(shù)據(jù)
System.out.println("Received:" + new String(data));
// 關(guān)閉連接
socket.close();
}
}
服務(wù)端程序群叶,建立ServerSocket監(jiān)聽客戶端Socket的連接請(qǐng)求,并使用Socket獲取輸入輸出流钝荡。
public class Server{
public static void main(String[] args){
ServerSocket ss = new ServerSocket(3000);
while(true){
Socket s= ss.accept();
PrintStream ps= new PrintStream (s.getOutputStream());
ps.println("您接收到服務(wù)器的消息");
ps.close();
s.close();
}
}
}
客戶端使用socket建立與IP地址盖呼、指定端口的連接,并使用Socket獲取輸入流獲取數(shù)據(jù)化撕。
public static void main(String[] args) throws IOException{
Socket socket=new Soket("127.0.0.1",30000);
BufferedRead br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line=br.readLine();
System.out.println("來自服務(wù)器的數(shù)據(jù): "+line);
br.close();
socket.close();
}
最后編輯于 :2017.12.06 06:09:05
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者