影视cms哪个好/郑州网站优化外包顾问
目录
1:网络编程(理解)
(3)网络编程的三要素
A:IP地址
IP地址的分类:
两个DOS命令:
特殊的IP地址:
B:端口
C:协议
(3)Socket机制
(4)UDP协议发送和接收数据(两案列)(掌握)
案列一:最基本的UDP协议发送和接收数据
案列二:代码优化
案列三:把发送数据改进为键盘录入
案列四:一个简易聊天小程序并用多线程改进
(5)TCP协议发送和接收数据(掌握)
案列一:最基本的TCP协议发送和接收数据
案列二:服务器反馈信息
案列三:客户端键盘录入,服务器输出到控制台
案列四:客户端键盘录入,服务器写到文本文件
案列五:客户端文本文件,服务器输出到控制台
案列六:客户端读取文本文件,服务器写到文本文件
案列七:客户端读取文本文件,服务器写到文本文件,并反馈
案列八:上传图片
案列八:多线程上传文件(while循环改进服务器接收多个客户端)
案列九:多线程改进上传文件(while循环加Runnable接口)
1:网络编程(理解)
(1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享
(2)网络编程模型
(3)网络编程的三要素
A:IP地址
网络中计算机的唯一标识。
计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。
但是呢,我们配置的IP地址确不是二进制的,为什么呢?
IP:192.168.1.100
换算:1100000010101000 00000001 01100100
假如真是:1100000010101000 00000001 01100100的话。
我们如果每次再上课的时候要配置该IP地址,记忆起来就比较的麻烦。
所以,为了方便表示IP地址,我们就把IP地址的每一个字节上的数据换算成十进制,然后用.分开来表示:
"点分十进制"
IP地址的组成:网络号段+主机号段
A类:第一号段为网络号段+后三段的主机号段
一个网络号:256*256*256 = 16777216
B类:前二号段为网络号段+后二段的主机号段
一个网络号:256*256 = 65536
C类:前三号段为网络号段+后一段的主机号段
一个网络号:256
IP地址的分类:
A类 1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) (2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254
E类 240.0.0.1---247.255.255.254
两个DOS命令:
ipconfig 查看本机ip地址
ping 后面跟ip地址。测试本机与指定的ip地址间的通信是否有问题
特殊的IP地址:
127.0.0.1 回环地址(表示本机)
x.x.x.255 广播地址
x.x.x.0 网络地址
import java.net.InetAddress;
import java.net.UnknownHostException;
/* 如果一个类没有构造方法:* A:成员全部是静态的(Math,Arrays,Collections)* B:单例设计模式(Runtime)* C:类中有静态方法返回该类的对象(InetAddress)* classDemo {* privateDemo(){}** publicstatic Demo getXxx() {* returnnew Demo();* }* }* 看InetAddress的成员方法:public static InetAddressgetByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象*/
public class InetAddressDemo {public static void main(String[] args) throws UnknownHostException {//public static InetAddress getByName(String host)//InetAddress address = InetAddress.getByName("liuyi");//InetAddress address = InetAddress.getByName("192.168.12.92");InetAddress address = InetAddress.getByName("192.168.12.63");//获取两个东西:主机名,IP地址//public String getHostName()String name = address.getHostName();//public String getHostAddress()String ip = address.getHostAddress();System.out.println(name+ "---" + ip);}
}
B:端口
是应用程序的标识。
物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
A:每个网络程序都会至少有一个逻辑端口
B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。
C:协议
UDP:数据打包,有限制(大小在限制在64k),不连接,效率高,不可靠
TCP:建立数据通道,无限制,效率低,通过三次握手完成连接,是可靠协议
(3)Socket机制
Socket套接字:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
(4)UDP协议发送和接收数据(两案列)(掌握)
案列一:最基本的UDP协议发送和接收数据
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/* UDP协议发送数据:* A:创建发送端Socket对象* B:创建数据,并把数据打包* C:调用Socket对象的发送方法发送数据包D:释放资源*/
public class SendDemo {public static void main(String[] args) throws IOException {//创建发送端Socket对象//DatagramSocket()DatagramSocket ds = new DatagramSocket();//创建数据,并把数据打包//DatagramPacket(byte[] buf, int length, InetAddress address, int port)//创建数据byte[] bys = "hello,udp,我来了".getBytes();//长度int length = bys.length;//IP地址对象InetAddress address = InetAddress.getByName("192.168.12.92");//端口int port = 10086;DatagramPacket dp = new DatagramPacket(bys, length, address, port);//调用Socket对象的发送方法发送数据包//public void send(DatagramPacket p)ds.send(dp);//释放资源ds.close();}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/* UDP协议接收数据:* A:创建接收端Socket对象* B:创建一个数据包(接收容器)* C:调用Socket对象的接收方法接收数据* D:解析数据包,并显示在控制台
E:释放资源 */
public class ReceiveDemo {public static void main(String[] args) throws IOException {//创建接收端Socket对象//DatagramSocket(int port)DatagramSocket ds = new DatagramSocket(10086);//创建一个数据包(接收容器)//DatagramPacket(byte[] buf, int length)byte[] bys = new byte[1024];int length = bys.length;DatagramPacket dp = new DatagramPacket(bys, length);//调用Socket对象的接收方法接收数据//public void receive(DatagramPacket p)ds.receive(dp);// 阻塞式//解析数据包,并显示在控制台//获取对方的ip//public InetAddress getAddress()InetAddress address = dp.getAddress();String ip = address.getHostAddress();//public byte[] getData():获取数据缓冲区//public int getLength():获取数据的实际长度byte[] bys2 = dp.getData();int len = dp.getLength();String s = new String(bys2, 0, len);System.out.println(ip+ "传递的数据是:" + s);//释放资源ds.close();}
}
案列二:代码优化
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {public static void main(String[] args)throws IOException {// 创建发送端的Socket对象DatagramSocket ds = newDatagramSocket();// 创建数据并打包byte[] bys ="helloworld".getBytes();DatagramPacket dp = newDatagramPacket(bys, bys.length,InetAddress.getByName("192.168.12.92"), 12345);// 发送数据ds.send(dp);// 释放资源ds.close();}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;/* 多次启动接收端:* java.net.BindException:Address already in use: Cannot bind端口被占用。*/
public class ReceiveDemo {public static void main(String[] args) throws IOException {//创建接收端的Socket对象DatagramSocket ds = new DatagramSocket(12345);//创建一个包裹byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);//接收数据ds.receive(dp);//解析数据String ip = dp.getAddress().getHostAddress();String s = new String(dp.getData(), 0, dp.getLength());System.out.println("from" + ip + " data is : " + s);//释放资源ds.close();}
}
案列三:把发送数据改进为键盘录入
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//* 数据来自于键盘录入//* 键盘录入数据要自己控制录入结束。
public class SendDemo {public static void main(String[] args) throws IOException {//创建发送端的Socket对象DatagramSocket ds = new DatagramSocket();//封装键盘录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = br.readLine()) != null) {if("886".equals(line)) {break;}//创建数据并打包byte[] bys = line.getBytes();//DatagramPacket dp = new DatagramPacket(bys, bys.length,//InetAddress.getByName("192.168.12.92"), 12345);DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.12.255"),12345);//发送数据ds.send(dp);}//释放资源ds.close();}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;//* 多次启动接收端://* java.net.BindException:Address already in use: Cannot bind//* 端口被占用。
public class ReceiveDemo {public static void main(String[] args) throws IOException {//创建接收端的Socket对象DatagramSocket ds = new DatagramSocket(12345);while(true) {//创建一个包裹byte[ ] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);//接收数据ds.receive(dp);//解析数据String ip = dp.getAddress().getHostAddress();String s = new String(dp.getData(), 0, dp.getLength());System.out.println("from" + ip + " data is : " + s);}//释放资源//接收端应该一直开着等待接收数据,是不需要关闭//ds.close();}
}
案列四:一个简易聊天小程序并用多线程改进
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendThread implementsRunnable {private DatagramSocket ds;public SendThread(DatagramSocket ds) {this.ds= ds;}@Overridepublic void run() {try{//封装键盘录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = br.readLine()) != null) {if("886".equals(line)) {break;}//创建数据并打包byte[] bys = line.getBytes();//DatagramPacket dp = new DatagramPacket(bys, bys.length,//InetAddress.getByName("192.168.12.92"), 12345);DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.12.255"),12306);//发送数据ds.send(dp);}//释放资源ds.close();}catch (IOException e) {e.printStackTrace();}}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiveThreadimplements Runnable {private DatagramSocket ds;public ReceiveThread(DatagramSocket ds) {this.ds= ds;}@Overridepublic void run() {try{while(true) {//创建一个包裹byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);//接收数据ds.receive(dp);//解析数据String ip = dp.getAddress().getHostAddress();String s = new String(dp.getData(), 0, dp.getLength());System.out.println("from" + ip + " data is : " + s);}}catch (IOException e) {e.printStackTrace();}}
}
import java.io.IOException;
import java.net.DatagramSocket;//* 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了
public class ChatRoom {public static void main(String[] args) throws IOException {DatagramSocket dsSend = new DatagramSocket();DatagramSocket dsReceive = new DatagramSocket(12306);SendThread st = new SendThread(dsSend);ReceiveThread rt = new ReceiveThread(dsReceive);Thread t1 = new Thread(st);Thread t2 = new Thread(rt);t1.start();t2.start();}
}
(5)TCP协议发送和接收数据(掌握)
案列一:最基本的TCP协议发送和接收数据
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;/* TCP协议发送数据:* A:创建发送端的Socket对象* 这一步如果成功,就说明连接已经建立成功了。* B:获取输出流,写数据* C:释放资源* 连接被拒绝。TCP协议一定要先看服务器。java.net.ConnectException: Connectionrefused: connect*/
public class ClientDemo {public static void main(String[] args) throws IOException {//创建发送端的Socket对象//Socket(InetAddress address, int port)//Socket(String host, int port)//Socket s = new Socket(InetAddress.getByName("192.168.12.92"), 8888);Sockets = new Socket("192.168.12.92", 8888);//获取输出流,写数据//public OutputStream getOutputStream()OutputStream os = s.getOutputStream();os.write("hello,tcp,我来了".getBytes());//释放资源s.close();}
}
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/ * TCP协议接收数据:* A:创建接收端的Socket对象* B:监听客户端连接。返回一个对应的Socket对象* C:获取输入流,读取数据显示在控制台D:释放资源*/
public class ServerDemo {public static void main(String[] args) throws IOException {//创建接收端的Socket对象//ServerSocket(int port)ServerSocket ss = new ServerSocket(8888);//监听客户端连接。返回一个对应的Socket对象//public Socket accept()Sockets = ss.accept(); // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。//获取输入流,读取数据显示在控制台InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys); // 阻塞式方法String str = new String(bys, 0, len);String ip = s.getInetAddress().getHostAddress();System.out.println(ip+ "---" + str);//释放资源s.close();//ss.close(); //这个不应该关闭}
}
案列二:服务器反馈信息
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s = new Socket("192.168.12.92", 9999);//获取输出流OutputStream os = s.getOutputStream();os.write("今天天气很好,适合睡觉".getBytes());//获取输入流InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys);// 阻塞String client = new String(bys, 0, len);System.out.println("client:"+ client);//释放资源s.close();}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss = new ServerSocket(9999);//监听客户端的连接Socket s = ss.accept(); // 阻塞//获取输入流InputStream is = s.getInputStream();byte[] bys = new byte[1024];int len = is.read(bys); // 阻塞String server = new String(bys, 0, len);System.out.println("server:"+ server);//获取输出流OutputStream os = s.getOutputStream();os.write("数据已经收到".getBytes());//释放资源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.net.Socket;//* 客户端键盘录入,服务器输出到控制台
public class ClientDemo {public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s = new Socket("192.168.12.92", 22222);//键盘录入数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//把通道内的流给包装一下BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while((line = br.readLine()) != null) {//键盘录入数据要自定义结束标记if("886".equals(line)) {break;}bw.write(line);bw.newLine();bw.flush();}//释放资源//bw.close();//br.close();s.close();}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss = new ServerSocket(22222);//监听客户端连接Socket s = ss.accept();//包装通道内容的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = null;while((line = br.readLine()) != null) {System.out.println(line);}//br.close();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.net.Socket;
// * 客户端键盘录入,服务器输出文本文件
public class ClientDemo {public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s = new Socket("192.168.12.92", 23456);//封装键盘录入BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//封装通道内的数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while((line = br.readLine()) != null) {if("over".equals(line)) {break;}bw.write(line);bw.newLine();bw.flush();}//bw.close();//br.close();s.close();}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss = new ServerSocket(23456);//监听客户端连接Socket s = ss.accept();//封装通道内的数据BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//封装文本文件BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));String line = null;while((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}bw.close();//br.close();s.close();//ss.close();}
}
案列五:客户端文本文件,服务器输出到控制台
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;//* 客户端文本文件,服务器输出到控制台
public class ClientDemo {public static void main(String[] args) throws IOException {//创建Socket对象Socket s = new Socket("192.168.12.92", 34567);//封装文本文件BufferedReader br = new BufferedReader(new FileReader("InetAddressDemo.java"));//封装通道内的流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}br.close();s.close();}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss = new ServerSocket(34567);//监听客户端连接Socket s = ss.accept();//封装通道内的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));String line = null;while((line = br.readLine()) != null) {System.out.println(line);}s.close();}
}
案列六:客户端读取文本文件,服务器写到文本文件
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class UploadClient {public static void main(String[] args) throws IOException {//创建客户端Socket对象Socket s = new Socket("192.168.12.92", 11111);//封装文本文件BufferedReader br = new BufferedReader(new FileReader("InetAddressDemo.java"));//封装通道内流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}//释放资源br.close();s.close();}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {public static void main(String[] args) throws IOException {//创建服务器端的Socket对象ServerSocket ss = new ServerSocket(11111);//监听客户端连接Socket s = ss.accept();//封装通道内的流BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//封装文本文件BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));String line = null;while((line = br.readLine()) != null) {bw.write(line);bw.newLine();bw.flush();}bw.close();s.close();}
}
案列七:客户端读取文本文件,服务器写到文本文件,并反馈
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;/* 按照我们正常的思路加入反馈信息,结果却没反应。为什么呢?* 读取文本文件是可以以null作为结束信息的,但是呢,通道内是不能这样结束信息的。* 所以,服务器根本就不知道你结束了。而你还想服务器给你反馈。所以,就相互等待了。* 如何解决呢?* A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。* 这样做可以解决问题,但是不好。* B:Socket对象提供了一种解决方案public void shutdownOutput()*/
public class UploadClient {public static void main(String[] args)throws IOException {// 创建客户端Socket对象Socket s = newSocket("192.168.12.92", 11111);// 封装文本文件BufferedReader br = newBufferedReader(new FileReader("InetAddressDemo.java"));// 封装通道内流BufferedWriter bw = newBufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while ((line = br.readLine()) !=null) { // 阻塞bw.write(line);bw.newLine();bw.flush();}//自定义一个结束标记
// bw.write("over");
// bw.newLine();
// bw.flush();//Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了s.shutdownOutput();// 接收反馈BufferedReader brClient = newBufferedReader(new InputStreamReader(s.getInputStream()));String client =brClient.readLine(); // 阻塞System.out.println(client);// 释放资源br.close();s.close();}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {public static void main(String[] args)throws IOException {// 创建服务器端的Socket对象ServerSocket ss = newServerSocket(11111);// 监听客户端连接Socket s = ss.accept();// 阻塞// 封装通道内的流BufferedReader br = newBufferedReader(new InputStreamReader(s.getInputStream()));// 封装文本文件BufferedWriter bw = newBufferedWriter(new FileWriter("Copy.java"));String line = null;while ((line = br.readLine()) !=null) { // 阻塞//if("over".equals(line)){// break;// }bw.write(line);bw.newLine();bw.flush();}// 给出反馈BufferedWriter bwServer = newBufferedWriter(new OutputStreamWriter(s.getOutputStream()));bwServer.write("文件上传成功");bwServer.newLine();bwServer.flush();// 释放资源bw.close();s.close();}
}
案列八:上传图片
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class UploadClient {public static void main(String[] args)throws IOException {// 创建客户端Socket对象Socket s = newSocket("192.168.12.92", 19191);// 封装图片文件BufferedInputStream bis = newBufferedInputStream(new FileInputStream("林青霞.jpg"));// 封装通道内的流BufferedOutputStream bos = newBufferedOutputStream(s.getOutputStream());byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) !=-1) {bos.write(bys, 0, len);bos.flush();}s.shutdownOutput();// 读取反馈InputStream is =s.getInputStream();byte[] bys2 = new byte[1024];int len2 = is.read(bys2);String client = new String(bys2,0, len2);System.out.println(client);// 释放资源bis.close();s.close();}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {public static void main(String[] args)throws IOException {// 创建服务器Socket对象ServerSocket ss = new ServerSocket(19191);// 监听客户端连接Socket s = ss.accept();// 封装通道内流BufferedInputStream bis = newBufferedInputStream(s.getInputStream());// 封装图片文件BufferedOutputStream bos = newBufferedOutputStream(new FileOutputStream("mn.jpg"));byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) !=-1) {bos.write(bys, 0, len);bos.flush();}// 给一个反馈OutputStream os =s.getOutputStream();os.write("图片上传成功".getBytes());bos.close();s.close();}
}
案列八:多线程上传文件(while循环改进服务器接收多个客户端)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public classUploadClient {public static void main(String[] args)throws IOException {// 创建客户端Socket对象Socket s = newSocket("192.168.12.92", 11111);// 封装文本文件BufferedReader br = newBufferedReader(new FileReader("InetAddressDemo.java"));// 封装通道内流BufferedWriter bw = newBufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while ((line = br.readLine()) !=null) { // 阻塞bw.write(line);bw.newLine();bw.flush();}// Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了s.shutdownOutput();// 接收反馈BufferedReader brClient = newBufferedReader(new InputStreamReader(s.getInputStream()));String client =brClient.readLine(); // 阻塞System.out.println(client);// 释放资源br.close();s.close();}
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;/* 通过while循环可以改进一个服务器接收多个客户端。* 但是这个是有问题的。* 如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端* 张三:好好学习.avi(100M) 256k* 李四:天天向上.mp3(3M) 1M王五:ILoveJava.txt(1k) 100M*/
public class UploadServer {public static void main(String[] args)throws IOException {// 创建服务器端的Socket对象ServerSocket ss = newServerSocket(11111);while (true) {// 监听客户端连接Socket s = ss.accept();// 阻塞// 封装通道内的流BufferedReader br = newBufferedReader(new InputStreamReader(s.getInputStream()));// 封装文本文件BufferedWriter bw = newBufferedWriter(new FileWriter("Copy.java"));String line = null;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();// 释放资源bw.close();s.close(); } }
}
案列九:多线程改进上传文件(while循环加Runnable接口)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class UploadClient {public static void main(String[] args)throws IOException {// 创建客户端Socket对象Socket s = newSocket("192.168.12.92", 11111);// 封装文本文件// BufferedReader br = newBufferedReader(new FileReader("InetAddressDemo.java"));BufferedReader br = newBufferedReader(new FileReader("ReceiveDemo.java"));// 封装通道内流BufferedWriter bw = newBufferedWriter(new OutputStreamWriter(s.getOutputStream()));String line = null;while ((line = br.readLine()) !=null) { // 阻塞bw.write(line);bw.newLine();bw.flush();}// Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了s.shutdownOutput();// 接收反馈BufferedReader brClient = newBufferedReader(new InputStreamReader(s.getInputStream()));String client = brClient.readLine();// 阻塞System.out.println(client);// 释放资源br.close();s.close(); }
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class UserThread implements Runnable {private Socket s;public UserThread(Socket s) {this.s = s;}@Overridepublic void run() {try {// 封装通道内的流BufferedReader br = newBufferedReader(new InputStreamReader(s.getInputStream()));// 封装文本文件// BufferedWriter bw = newBufferedWriter(new// FileWriter("Copy.java"));// 为了防止名称冲突String newName =System.currentTimeMillis() + ".java";BufferedWriter bw = newBufferedWriter(new FileWriter(newName));String line = null;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();// 释放资源bw.close();s.close();} catch (IOException e) {e.printStackTrace();}}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {public static void main(String[] args) throws IOException {//创建服务器Socket对象ServerSocket ss = new ServerSocket(11111);while(true) {Socket s = ss.accept();newThread(new UserThread(s)).start();}}
}