案例一:
需求:
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=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=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();
}
}
}
浙公网安备 33010602011771号