开始时间:2018年9月18日10:20:52
结束时间:2018年9月18日12:32:12
累计时间:2
今天吧坑补上吧,这一篇啥也没写 骗了60访问量,良心过不去了。
转换文本格式
功能: 客户端向服务器端发送字符,服务器端转化为大写返回
服务器端代码
public class TcpServer {
public static void main(String[] args) throws IOException {
/* (1)准备服务:
(2)accept: 获得客户单的服务:
(3)客户端的服务: 获得输入流: 读取客户端发送过来的数据:
(4)转换成大写:
(5)获得输出流, 将大写的文本写入输出流:
*/
ServerSocket ss = new ServerSocket(9999);
Socket s = ss.accept();
// 获取输入流 读取客户端发送过来的信息
BufferedReader bufIn = new BufferedReader(
new InputStreamReader(s.getInputStream()));
// 向客户端响应数据
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bufIn.readLine())!=null)
{
System.out.println(line);
out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}
客户端代码
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("192.168.1.118",9999);
// 自定义键盘录入对象
BufferedReader bufr=new BufferedReader(
new InputStreamReader(System.in));
// 装饰设计模式,王输出流中写入数据
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
// 读取服务器响应过来的数据:流
BufferedReader bufIn = new BufferedReader(
new InputStreamReader(s.getInputStream()));
String line = null;
while((line=bufr.readLine())!=null )
{
if("over".equals(line))
{
break;
}
out.println(line);
// 循环读取响应回来的数据
String str = bufIn.readLine();
System.out.println("server "+str);
}
bufr.close();
s.close();
}
}
cmd 命令:
1 先换盘 输入e:
2 cd表示进入该目录 输入该文件 class 所在的bin目录 如下图
补充cmd实用命令:
1 start 进入当前目录
2 cd 进入目录( 如 e:)
3 Ctrl + c 重启
提示:如果是在本地运行服务器,每次启动IP地址会变化,需要重新查看Ip。
运行效果如上图
上传文本文件
客户端:
(1)服务
(2)获得输入流: 读取文件:
(3)获得输出流: 将数据写入到输出流当中。
(4)继续获得输入流: 读取服务器响应回来的数据。
代码:
package com.yidongxueyuan.tcp;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class TextClient {
public static void main(String[] args) throws UnknownHostException, IOException {
/*
*
*/
Socket s= new Socket("192.168.2.218",9999);
FileReader fr = new FileReader("C:/Users/Mrzhang/javaEE/javaSE-08/javaSE-32/javaList.txt");
//准备输出流: 向流当中的写数据:
PrintWriter out = new PrintWriter(s.getOutputStream(),true);//
//准备一个流: 准备读取数据:
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
char ch[] = new char[1024];
int len=0;
while((len=fr.read(ch))!=-1){//将数据读取放在字符数组当中:
//循环写出去:
out.println(ch);
}
s.shutdownOutput();//告知服务器端,文件已经读取完毕:
//读取响应回来的数据:
String line = bufIn.readLine();
System.out.println(line);
}
}
s.shutdownOutput();//告知服务器端,文件已经读取完毕:
这一步如果没有的话,会出现客户端和服务器端同时等待的情况
服务端:
(1)服务:
(2)获得客户端的服务“:
(3)获得输入流, 读取流当中的数据。
(4)输出流: 将数据找个位置保存起来。
(5)准备输出流, 给客户端响应。
package com.yidongxueyuan.tcp;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TextServer {
public static void main(String[] args) throws IOException {
/*
*
*/
int port = 9999;
ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();
// 获得流,读取流当中的数据》 客户端发送的数据。
BufferedReader bufIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
//将读取的文件数据保存起来:
PrintWriter out = new PrintWriter(new File("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-52/copy.txt"));//
//准备一个流: 给客户端响应数据:
int num= 0;
char ch[]= new char[1024];
while((num=bufIn.read(ch))!=-1){
//将数组当中的内容写出去:
out.println(ch);
out.flush();
}
//告知客户端, 数据已经读取完毕。
s.shutdownInput();
//响应数据:
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("文本上传成功:谢谢");
}
}
上传图片原理类似,只放代码
客户端:
package com.yidongxueyuan.tcp;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class PicClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket s= new Socket("192.168.2.218",10009);
//字节输入流: 读取图片文件:
FileInputStream fis = new FileInputStream(new File("C:/Users/Mrzhang/Desktop/API/a练习图片/XXX.jpg"));
InputStream in = s.getInputStream();
//准备流,写到输出:
OutputStream out = s.getOutputStream();
byte buf[]= new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1){// IO
out.write(buf,0,len);
}
//告知服务器写完:
s.shutdownOutput();
//读取相应回来的数据:
byte b[]= new byte[1024];
int num = in.read(b);
System.out.println(new String(b,0,num));
s.close();
}
}
服务器端:
package com.yidongxueyuan.tcp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class PicServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666);
//accept: 获得客户端的服务:
Socket s = ss.accept();
InputStream in = s.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-52/yourWife.jpg"));
byte buf []= new byte[1024];
int len=0;
while((len=in.read(buf))!=-1){
fos.write(buf, 0, len);
}
s.shutdownInput();
//准备流: 相应数据:
OutputStream out = s.getOutputStream();
out.write("您上传的图片已经收到了xiexie~".getBytes());
s.close();
ss.close();
}
}
多线程技术上传
问题: 服务器端只能处理一个客户端,当B客户端发送来请求时候,如果服务器端没有处理完A请求,B只能等待。
。
五: 服务器端多线程解决多个客户端请求: 图片上传:
(1)客户端,跟之前的一致。
(2)服务器端,使用多线程技术: 同时处理多个客户端请求。
package com.yidongxueyuan.tcp;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class PicThread implements Runnable {
private Socket s; // 处理不同的客户端:
public PicThread( Socket s){
this.s=s;
}
int count =1; //计数
@Override
public void run() {
//定义一个流: 获得数据
try {
String ip= s.getInetAddress().getHostAddress();
InputStream in= s.getInputStream();
//封装了一个父路径:
File parent = new File("C:/Users/Mrzhang/javaEE/javaSE-07/javaSE-52");
//整体的路径:
File file = new File(parent, ip+(count++)+".jpg");
while(file.exists())//加判断,文件存在,文件名称重新赋值。
file = new File(parent, ip+(count++)+".jpg");
FileOutputStream fos = new FileOutputStream(file);
byte b[]= new byte[1024];
int len =0 ;
while((len= in.read(b))!=-1){
fos.write(b,0,len);
}
s.shutdownInput();
OutputStream out = s.getOutputStream();
out.write("上传成功".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试
package com.yidongxueyuan.tcp;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TestPicThread {
public static void main(String[] args) throws IOException {
ServerSocket ss= new ServerSocket(10009);
while(true){
Socket s= ss.accept();
new Thread(new PicThread(s)).start();
}
}
}
后期可以加一些过滤之类的~
2018年9月18日12:31:15于易动