------- android培训、java培训、期待与您交流! ----------
一.网络编程三要素:
1.IP:
二进制:四段8位的二进制表示;
十进制:四段3位的0--255的数字;
2.端口:
1).物理端口:网卡口
2).逻辑端口:由操作系统维护,Windows下0--65535
0-1024由系统内部使用,我们尽量不要使用;
我们讲的端口:逻辑端口:
3.协议:
1).UDP协议:
A.将数据源和目的封装成数据包中,
B.不需要建立连接;
C.每个数据报的大小在限制在64k;
D.因无连接,是不可靠协议;但速度快
2).TCP协议:
A.需要建立连接;
B.在连接中进行大数据量传输;
C.通过三次握手完成连接,是可靠协议;
D.必须建立连接,效率会稍低
二.UDP协议编程:
1.发送端:
1.实例化DatagramSocket();
DatagramSocket socket = new DatagramSocket();
2.准备数据:
IP: InetAddress add = InetAddress("Lenovo-PC");
端口: int port = 8888;
数据: byte[] byteArray = "你好".getBytes();
3.准备数据报:
DatagramPacket packet = new DatagramPacket(byteArray,
byteArray.length,
add,port);
4.发送:
socket.send(packet);
5.释放资源:
socket.close();
2.接收端:
//1.实例化DatagramSocket
DatagramSocket socket = new DatagramSocket(8888);
//2.准备一个空的byte[]数组
byte[] byteArray = new byte[1024];
//3.准备一个空的DatagramPacket
DatagramPacket packet = new DatagramPacket(byteArray,byteArray.length);
//4.等待信息
socket.receive(packet);
//5.获取信息
byte[] infoArray = packet.getData();
String info = new String(infoArray,0,packet.getLength());
System.out.println("获取的信息:" + info);
//6.释放资源
socket.close();
三.TCP协议编程:
1.发送端:
//1.实例化一个Socket
Socket socket = new Socket("192.168.38.91",8888);
//2.获取输出流
OutputStream out = socket.getOutputStream();
//3.输出,一次输出一个字节数组
out.write("你好".getBytes());
//4.释放资源
out.close();
socket.close();
2.接收端:
//1.实例化一个ServerSocket
ServerSocket server = new ServerSocket(8888);
//2.获取输入流
InputStream in = socket.getInputStream();
//3.一次读取一个字节数组
byte[] byteArray = new byte[1024];
int len = in.read(byteArray);
String s = new String(byteArray,0,len);
System.out.println("接收到的数据:" + s);
//4.释放资源
in.close();
sever.close();
下面我编写了关于多个客户端上传到一个服务器的例子,也算是对前面知识的一个小总结:
package cn.itcast.demo13.TCP练习_关于多个客户端上传到一个服务器的思考;
public class Client {
public static void main(String[] args) {
//模拟10个客户端同时连接服务器
for(int i = 1 ; i <= 10 ;i ++){
new ClientThread(i).start();
}
}
}
package cn.itcast.demo13.TCP练习_关于多个客户端上传到一个服务器的思考;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientThread extends Thread {
private int index;
public ClientThread(int index){
this.index = index;
}
@Override
public void run() {
//连接服务器
try {
Socket socket = new Socket("192.168.30.241",8888);
//网络输出流
OutputStream netOut = socket.getOutputStream();
//文件输入流
FileInputStream fileIn = new FileInputStream("C:\\ccc\\" + index + ".png");
//一次读取一个字节数组
byte[] byteArray = new byte[1024];
int len = 0;
while((len = fileIn.read(byteArray)) != -1){
netOut.write(byteArray,0,len);
}
//释放资源
fileIn.close();
netOut.close();
socket.close();
System.out.println("文件:" + index + ".png 上传完毕!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
package cn.itcast.demo13.TCP练习_关于多个客户端上传到一个服务器的思考;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException{
ServerSocket server = new ServerSocket(8888);
int index = 1;
while(true){
Socket socket = server.accept();
//启动线程;
new ServerThread(index++,socket).start();
}
}
}
package cn.itcast.demo13.TCP练习_关于多个客户端上传到一个服务器的思考;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ServerThread extends Thread {
public int index ;
private Socket socket ;
//此索引,跟客户端的索引不是一一对应的;
public ServerThread(int index,Socket socket){
this.index = index;
this.socket = socket;
}
@Override
public void run() {
//获取网络输入流
try {
InputStream netIn = socket.getInputStream();
FileOutputStream fileOut = new FileOutputStream(index + ".png");
byte[] byteArray = new byte[1024];
int len = 0;
while((len = netIn.read(byteArray)) != -1){
fileOut.write(byteArray,0,len);
}
fileOut.close();
netIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//文件的输出流
}
}