案例一:
需求:
1.客戶端:發送資料,接收服務器反饋
2.服務器:接收資料,給出反饋
分析:
客戶端步驟:
1.創建客戶端Client的Socket物件
2.發送資料
3.接受服務端Service的反饋,也就是讀資料
4.釋放資源
package Demo042003;
/*客戶端
1.創建客戶端Client的Socket物件
2.發送資料
3.接受服務端Service的反饋,也就是讀資料
4.釋放資源
* */
?
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
?
public class ClientTcp {
public static void main(String[] args) throws IOException {
//創建客戶端Client的Socket物件
Socket s=new Socket("127.0.0.1",54638);
//發送資料
OutputStream ops = s.getOutputStream();
ops.write("最美不過姑娘你".getBytes());
//接受服務端Service的反饋,也就是讀資料
InputStream ips = s.getInputStream();
byte[]bytes=new byte[1024];
int len=ips.read(bytes);
System.out.println("服務器反饋是"+new String(bytes,0,len));
//釋放資源
s.close();
}
}
服務端步驟:
1.創建服務端Server的ServerSocket物件
2.接收資料
3.接收成功后發出反饋,也就是寫資料
4.釋放資源
package Demo042003;
?
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
?
/*服務端
1.創建服務端Server的ServerSocket物件
2.接收資料
3.接收成功后發出反饋,也就是寫資料
4.釋放資源
* */
public class ServerTcp {
public static void main(String[] args) throws IOException {
//創建服務端Server的ServerSocket物件
ServerSocket ss = new ServerSocket(54638);
//accept() 偵聽要連接到此套接字并接受它回傳一個Soket物件
Socket s = ss.accept();
//接收資料
InputStream ips = s.getInputStream();
byte[] bytes = new byte[1024];
int len = ips.read(bytes);
System.out.println("接收到的資料是\r\n" + new String(bytes, 0, len));
?
//接收成功后發出反饋,也就是寫資料
OutputStream ops = s.getOutputStream();
ops.write("已接受資料".getBytes());
//釋放資源
//ss.close();
?
?
}
}
疑問:為什么服務器接收資料時不能使用while回圈接收?在使用回圈接受的話會出現客戶端無法收到反饋
已找到原因:客戶端發送完畢后服務端還在等待接收訊息,所以無法給出反饋,需要在客戶端發送資料完成后使用
//定義發送完畢標記
s.shutdownOutput();
shutdownOutput()` 禁用此套接字的輸出流,
使用后服務端將不再等待接收訊息,繼續向下執行
案例二
需求:
1.客戶端:資料來源于鍵盤輸入,直到輸入的資料是over,發送資料結束
2.服務器:接收資料在控制臺輸出,并給出反饋
分析:與案例一基本相同,只是增加了鍵盤錄入的部分
客戶端
package Demo042005;
?
import java.io.*;
import java.net.Socket;
?
public class ClientDemo {
public static void main(String[] args) throws IOException {
//創建Socket物件
Socket s=new Socket("cy",12345);
//封裝鍵盤錄入資料
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//封裝輸出流
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line=br.readLine())!=null){
if ("over".equals(line)){
break;
}
//獲取輸出流物件
// OutputStream ops = s.getOutputStream();
// ops.write(line.getBytes());
bw.write(line);
bw.newLine();
bw.flush();
}
//獲取反饋
InputStream ips = s.getInputStream();
byte[]bytes=new byte[1024];
int len;
while ((len=ips.read(bytes))!=-1) {
System.out.println("服務器反饋是"+new String(bytes,0,len));
?
}
//釋放資源
s.close();
?
?
}
}
服務端
package Demo042005;
?
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
?
public class ServerDemo {
public static void main(String[] args) throws IOException {
//創建ServerSocket物件
ServerSocket ss=new ServerSocket(12345);
//監聽
Socket s = ss.accept();
//獲取資料
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line=br.readLine())!=null){
System.out.println(line);
}
//接收完畢給出反饋
OutputStream ops = s.getOutputStream();
ops.write("已接收資料".getBytes());
//釋放資源
ss.close();
}
}
案例三
需求:
客戶端:資料來源于鍵盤錄入,直到輸入的資料是886,發送資料停止
服務端:將接收到的資料寫入文本檔案
客戶端
package Demo042101;
?
import java.io.*;
import java.net.Socket;
?
public class ClientDemo {
public static void main(String[] args) throws IOException {
//創建Socket物件
Socket s=new Socket("cy",12345);
//封裝鍵盤錄入資料
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//封裝寫資料
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while ((line=br.readLine())!=null){
if ("over".equals(line)){
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
}
}
服務端
package Demo042101;
?
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
?
public class ServerDemo {
public static void main(String[] args) throws IOException {
//創建ServerSocket物件
ServerSocket ss=new ServerSocket(12345);
//監聽并獲取Socket物件
Socket s = ss.accept();
//創建要寫入的文本檔案物件
FileWriter fw=new FileWriter(new File("E:\\server.txt"));
?
// //創建字符輸入流物件
// BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//讀取資料
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line=br.readLine())!=null){
fw.write(line);
fw.flush();
fw.close();
}
}
}
案例四
需求:
客戶端:資料來自于文本檔案
服務端:接收到的資料寫入文本檔案
客戶端
package Demo042102;
?
import java.io.*;
import java.net.Socket;
?
public class ClientDemo {
public static void main(String[] args) throws IOException {
//創建Socket物件
Socket s=new Socket("cy",12345);
//創建讀取檔案物件
BufferedReader br=new BufferedReader(new FileReader(new File("E:\\abc.txt")));
//創建寫入物件
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//讀取資料
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
}
}
服務端
package Demo042102;
?
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
?
public class ServerDemo {
public static void main(String[] args) throws IOException {
//創建ServerSoket物件
ServerSocket ss=new ServerSocket(12345);
//監聽并回傳Socket物件
Socket s = ss.accept();
?
//創建讀取檔案物件
BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\Server.txt"));
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
?
}
}
案例五
需求:
客戶端:資料來自于文本檔案,并接收反饋
服務端:接收到的資料寫入文本檔案,并給出反饋
客戶端
package Demo042102;
?
import java.io.*;
import java.net.Socket;
?
public class ClientDemo {
public static void main(String[] args) throws IOException {
//創建Socket物件
Socket s=new Socket("cy",12345);
//創建讀取檔案物件
BufferedReader br=new BufferedReader(new FileReader(new File("E:\\abc.txt")));
//創建寫入物件
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//讀取資料
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//結束
s.shutdownOutput();
//接受反饋
BufferedReader brclinet=new BufferedReader(new InputStreamReader(s.getInputStream()));
String data;
data=https://www.cnblogs.com/CYan521/archive/2022/04/21/brclinet.readLine();
System.out.println("服務器:"+data);
?
?
}
}
服務端
package Demo042102;
?
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
?
public class ServerDemo {
public static void main(String[] args) throws IOException {
//創建ServerSoket物件
ServerSocket ss=new ServerSocket(12345);
//監聽并回傳Socket物件
Socket s = ss.accept();
?
//創建讀取檔案物件
BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\Server.txt"));
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//給出反饋
BufferedWriter bwserver=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwserver.write("已收到資料");
bwserver.newLine();
bwserver.flush();
?
}
}
案例六
需求:
客戶端:資料來自于文本檔案,并接收反饋
服務端:接收到的資料寫入文本檔案,并給出反饋,代碼用執行緒進行封裝,為每一個客戶端開啟一個執行緒
ServerThread類
package Demo042103;
?
import java.io.*;
import java.net.Socket;
?
public class ServerThread implements Runnable {
private Socket s;
public ServerThread(Socket s) {
this.s=s;
}
?
@Override
public void run() {
?
try {
//寫入資料
BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\Server.txt"));
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//給出反饋
BufferedWriter bwServer=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwServer.write("上傳檔案完成");
bwServer.newLine();
bwServer.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端
package Demo042103;
?
import java.io.*;
import java.net.Socket;
?
public class ClientDemo {
public static void main(String[] args) throws IOException {
//創建Socket物件
Socket s=new Socket("cy",12345);
//創建讀取檔案物件
BufferedReader br=new BufferedReader(new FileReader(new File("E:\\abc.txt")));
//創建寫入物件
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//讀取資料
String line;
while ((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//結束
s.shutdownOutput();
//接受反饋
BufferedReader brclinet=new BufferedReader(new InputStreamReader(s.getInputStream()));
String data;
data=https://www.cnblogs.com/CYan521/archive/2022/04/21/brclinet.readLine();
System.out.println("服務器:"+data);
?
}
?
}
服務端
package Demo042103;
?
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
?
public class ServerDemo {
public static void main(String[] args) throws IOException {
//創建ServerSoket物件
ServerSocket ss=new ServerSocket(12345);
while (true){
//監聽并回傳Socket物件
Socket s = ss.accept();
//創建執行緒,為每一個客戶端開啟一個執行緒
new Thread(new ServerThread(s)).start();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/460827.html
標籤:其他
下一篇:Frida Hook可變引數
