套接字練習
服務器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
public static void main(String[] args) throws IOException {
// 創建綁定到特定端口的服務器套接字,ServerSocket類基於請求執行某些操作;
ServerSocket ss = new ServerSocket(6666/*接受端口,與發送端端口一致*/);
System.out.println("等待連接。。。。。。");
for (;;){
//偵聽並接收此套接字的連接,accept方法在連接傳入之前一直阻塞。
// 在for循環中accept和一個ip地址建立一個連接後,就會繼續偵聽下一個地址的連接。
Socket socket = ss.accept();
//連接成功後,獲取對方ip地址的字符串
String remoteIp = ((InetSocketAddress)socket.getRemoteSocketAddress()).getAddress().getHostAddress();
//獲取對方端口
int remotePort = ((InetSocketAddress)socket.getRemoteSocketAddress()).getPort();
//在控制檯打印出對方地址
System.out.println(remoteIp + ":" + remotePort +"連接進來了!!");
//開啓一個通信的線程
new CommThread(remoteIp,remotePort,socket).start();
}
}
//創建一個通信線程
static class CommThread extends Thread{
private String ip;
private int port;
private Socket sock;
public CommThread(String ip, int port,Socket sock) {
this.ip = ip;
this.port = port;
this.sock = sock;
}
public void run(){
//獲取套接字地址的輸入流
InputStream in = null;
try {
in = sock.getInputStream();
//將字節流強轉成字符流,按行讀取
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = br.readLine()) != null){
System.out.println(ip + ":" + port + "說:" + line);//
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客戶端
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class SenderTest {
public static void main(String[] args) throws IOException {
//創建客戶端套接字
Socket sock = new Socket("localhost"/*客戶端ip地址*/, 6666/*發送端口,與接受端口號一致*/);
// 獲取此套接字的輸出流。
OutputStream os = sock.getOutputStream();
//創建一種循環發送消息的方法
for(int index = 1;;index++){
//數據報包傳輸的是字節數組,所以輸出流爲字節數組;
/*os.write(("重要的事情說" + index + "遍").getBytes());//因爲服務器端輸入流是按行讀取,所以如
*果定義的傳輸內容不含換行符,則服務器端br.readLine()會一直阻塞直到讀取到換行符語句纔會繼續向下執行*/
os.write(("重要的事情說" + index + "遍"+"\r\n").getBytes());
os.flush();
/*DatagramPacket packet = new DatagramPacket();//自己第一次默寫的時候還想建立一個數據報包,
* 但同學提醒我說,TCP傳輸已經建立數據流連接,不需要報包傳輸,所以只要將傳輸的字節寫入流就行了*/
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}