UDP通信
>将数据及源和目的封装在数据包中,不需要建立连接
>每个数据报的大小限制在64k以内
>因为无连接,是不可靠传输。QQ输天
>不需要建立连接,速度快,效率高
UDP套接字编程:
package Socket;
import java.io.IOException;
import java.net.*;
/**
*
* @author Administrator
*需求:通过Udp转输方式,将一段文字发送出去
* 思路:
* 1、建立UdpSocket服务
* 2、提供数据,并将数据封装到数据包中
* 3、通过Socket服务功能,将数据包发出去
* 4、关闭资源
*/
public class UdpSend {
public static void main(String[] args) throws IOException {
//1、创建udp服务,通过DatagramSocket对象
DatagramSocket socket = new DatagramSocket(8888);
//2、确定数据,并封装成DatagramPacket数据包(字节数组)
byte[]data = "udp ,哥们儿来了!".getBytes();
DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getByName("192.168.0.12"),1000);
//3、通过Socket服务将已有的数据包发送出去。通过send方法
socket.send(packet);
//4、关闭
socket.close();
}
}
/**
*
* @author Administrator
* 需求:定义一个应用程序,用于接收并处理upd数据
* 思路:
* 1、建立udpSocket服务
* 2、定义数据包
* 3、通过socket服务中的receive方法将接收到的数据存入定义好的数据包中
* 4、通过数据包对象的特有功能,将这些不同的数据提取出来
* 5、关闭资源
*/
class UdpReceive{
public static void main(String[] args) throws IOException {
//1、创建udpSocket服务 ,通常会监听一个端口
DatagramSocket socket = new DatagramSocket(1000);
//2、定义数据包,用于存储数据
byte []data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data,data.length);
//3、通过receive方法将接收到的数据放到定义好的数据包中
socket.receive(packet);
//4、通过数据包中的方法获取其中的数据
String ip = packet.getAddress().getHostAddress();
String str = new String(packet.getData(),0,packet.getLength());
int port = packet.getPort();
System.out.println("ip:"+ip);
System.out.println("data:"+str);
System.out.println("port:"+port);
socket.close();
}
}
TCP通信
>建立连接,形成传输数据的通道
>在连接中进行大量数据传输
>通过三次握手建立连接,可靠传输。下载文件
>必须建立连接,效率会稍低
TCP套按字编程:
package Socket;
import java.net.*;
import java .io.*;
/**
* 需求:建立一个文本转换服务器。客户端给服务端发送文本,服务端会将文本转换成大写再返回给客户端,
* 而且客户端可以不断地进行文本转换,当客户端输入over时,转换结束。
*
*/
public class TcpDemo2 {
public static void main(String[] args) {
}
}
/**
* 客户端分析:
* 既然是操作设备上的数据,那么就可以用io技术,并按照io的操作规律来思考
* 源:键盘录入
* 目的:网络设备,网络输出流
* 而且操作的是文本数据,可以使用字符流
* 步骤:
* 1、建立服务
* 2、获取键盘录入
* 3、将数据发给服务端
* 4、获取服务端返回的大写数据
* 5、结束,关资源
* 注:都是文本数据,可以用字符流操作,同时加入缓冲提高效率
*
*/
class TcpClient2{
public static void main(String[] args) throws Exception {
Socket s = new Socket("192.168.0.6",8889);
//定义读取键盘数据的流对象
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
//定义目的,将数据写出到socket输出流,发给服务器端
BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//定义一个socket读取流,读取服务器端返回的大写信息
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line = bufr.readLine())!=null){
if("over".equals(line))
break;
bufOut.write(line);
bufOut.newLine();
bufOut.flush();
String str = bufIn.readLine();
System.out.println("Server:"+str);
}
bufr.close();
s.close();
}
}
class TcpServer2{
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(8889);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"connected...");
BufferedReader bf = new BufferedReader(new InputStreamReader(s.getInputStream()));
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line = bf.readLine())!=null){
System.out.println(line);
pw.println(line.toUpperCase());
//System.out.println(line);
//bw.write(line.toUpperCase());
//bw.newLine();
//bw.flush();
}
s.close();
ss.close();
}
}
/**
* 该例子出现的问题。
* 现象:客户端和服务器端都在莫名的等待
* 为什么呢?
* 因为客户端和服务器端都有阻塞式的方法readLine()。这些方法没有读到结束标记(回车符),那么
* 就会一直等待,导致两端都在等待
*
* */