---------------------- android培训、java培训、期待与您交流! ----------------------
网络编程:
Udp和Tcp特点:
Udp:将数据集源和目的封装成数据包中,不需要建立连接
每个数据包的大小限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
Tcp:建立连接,形成传输数据的通道
在连接中进行大数据量的传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
UDP传输实现:
建立发送服务,将数据封装在包中,在包中指定目的地址ip和端口号,发送
建立接收服务(指定监听的端口),定义用于接收数据的包,receive数据。通过包中的定义的方法取数据。
定义UDP发送端:
1. 建立UDPSocket服务(DatagramSocket),自动分配一个端口号
2. 将数据变成byte数组,将数组封装的数据包(DatagramPacket)中
3. 通过Socket服务发送数据包,指定服务器地址和接收的端口号
4. 关闭资源
定义UDP接受端:
1. 建立UDPSocket服务(DatagramSocket),(通常会监听一个端口,其实就是给这个网络应用程序定义数字标识,方便于明确那些数据过来应应用程序可以处理,此端口对应于服务发送端的端口)
2.定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数组中的不同数据信息。
3.通过Socket服务的receive方法(阻塞式方法)将接收的到的数据存入已定义好的数据包中(DatagramPackett)
4.通过DatagramPacket中的定义的方法,将数据取出。
5.关闭资源。
UDP键盘录入式数据:
1、BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
UDP聊天程序:
有收数据和发数据的部分,这两个部分需要同时执行:
1、分别将发送和接收封装到两个类中,
TCP传输实现:
建立客户端Socket指定连接的主机和端口,形成连接通道,通过获取Socket中的读写流传输数据(服务器端首先要通过ServerSocket获得客户端Socket对象,进行读写操作)
定义TCP客服端:
1、 创建Socket服务,并指定要连接的主机和端口。
2、 获取socket流中的输入流和输出流进行数据的发送和接收。
定义TCP服务端:
1、 创建ServerSocket服务,并监听端口
2、 获取连接过来的socket客服端对象,通过ServerSocket的accept()方法,没有连接就会等,所以这个方法是阻塞式的
3、 客服端如果发过来数据,那么服务端要使用对应的客服端对象,并获取该对象的读取流来读取发过来的数据,
4、 关闭客户端,关闭服务器(可选)
传输键盘录入:
1、BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
2、写入读取的一行数据后,结束标识(换行符)并没有写入,读取没读到结束标识(换行符),所以等待
TCP文件上传:
注意:
1、使用BufferedReader等流对象进行装饰后读取时,注意是否读到结束标识,(而写入时并没有把结束标识写进流中。)
2、关闭此套接字也将会关闭该套接字的 InputStream和 OutputStream。
TCP图片上传:同文件上传
当使用PrintWriter时,构造中加入boolean,自动刷新。否则要手动刷新。
而BufferedWriter没有自动刷新功能
TCP并发上传图片:
将上传的动作进行封装线程,
TCP并发登陆:
自定义服务器:浏览器客户端(获取浏览器发的http头信息)
自定义客户端:tomcat服务器端
java.net下URL类。URLConnection连接对象通过指定的URL连接,封装了协议,可解析协议。如:封装http协议后可解析去掉响应消息头。
TCP练习:
package org.cc.tcp;
import java.net.*;
import java.io.*;
//Tcp并发上传图片
class TCPPicBC {//客服端上传图片
public static void main(String[] args) throws Exception {
Socket s = new Socket("110.186.55.142", 10001);
File f = new File("C:" + File.separator + "chen.jpg");
FileInputStream fis = new FileInputStream(f);
OutputStream os = s.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
}
s.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(s//接收服务器端的消息
.getInputStream()));
String line = null;
line = br.readLine();
System.out.println(line);
fis.close();
s.close();
}
}
//服务器端接收图片发送消息
class TCPThread implements Runnable {
private Socket s;
public TCPThread(Socket s) {
this.s = s;
}
public void run() {
try {
InputStream is = this.s.getInputStream();
File f = new File("D:" + File.separator + "chen.jpg");
int count = 0;
while (f.exists()) {
f = new File("D:" + File.separator + "chen(" + (++count)
+ ").jpg");
}
FileOutputStream fos = new FileOutputStream(f);
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
fos.write(b, 0, len);
}
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println("上传成功");
pw.close();
fos.close();
this.s.close();
} catch (Exception e) {
throw new RuntimeException("上传失败");
}
}
}
//测试类
class TCPPicBS {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10001);
while (true) {
Socket s = ss.accept();
new Thread(new TCPThread(s)).start();
}
}
}
UDP练习:
package org.cc.udp;
import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.io.InputStreamReader;
import java.io.BufferedReader;
/*
* 聊天程序:即可接收数据又可以发送数据
* 接收和发送同时执行
*/
class Send implements Runnable {//发送消息线程类
private DatagramSocket ds;
public Send(DatagramSocket ds) {
this.ds = ds;
}
@Override
public 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[] b = line.getBytes();
DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress
.getByName("110.186.89.80"), 10002);
ds.send(dp);
}
} catch (Exception e) {
throw new RuntimeException("send failed");
}
}
}
class Reciev implements Runnable {//接收消息线程类
private DatagramSocket ds;
public Reciev(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
while (true) {
try {
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String ip = dp.getAddress().toString();
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println(ip + ":::" + data);
} catch (Exception e) {
throw new RuntimeException("reciev failed");
}
}
}
}
//测试类
public class UDPQQDemo {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
DatagramSocket dr = new DatagramSocket(10002);
new Thread(new Send(ds)).start();
new Thread(new Reciev(dr)).start();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------