---------------------- android培训、java培训、期待与您交流! -------------------
UDP协议与TCP协议
UDP协议:分为发送端和接收端
特点:全名是用户数据报协议 比如(QQ,聊天工具,发送短信)
是非面向连接 就是在发送前不用和对方建立连接,这也导致发送的数据可能会丢失
它不为IP提供可靠性,而且它的传输数据一次不能超过64k,但是它的传输速度非常快
接收端只能接收不能给发送端反馈信息
发送端: 要定义DatagramSocket对象,拿到要传输数据后,将它打成byte类型数组
在定义DatagramPacket对象,在对象中写入数据,数据长度,要传输的对象Ip,Ip的端口号
最后用DatagramSocket对象中的send方法发送出去
接收端:也要先定义DatagramSocket对象,要在对象中写入端口号要和发送端写入的一致
定义byte数组(缓存) 在定义DatagramPacket对象 在对象中写入数组和数组长度
在用DatagramSocket对象中receire方法接收发送端发送的数据 并将它和ip输出
TCP协议:分为客户端和服务端
特点: 全名是传输控制协议 比如(打电话)
是面向连接的 就是说要和谁发送数据就要先和对方建立连接,一般会分为3个步骤
1.客户端会向服务端发送请求:你在吗?2.服务端如果在会向客户端返回信息 我在
3.客户端接到服务端的信息就会在此发送请求:那我发送数据啦 这样连接就建立好了
TCP协议因为这样的特点数据的安全性很高,它会给IP提供可靠性也可以传送很大的数据
但它的速度较慢
服务端:除了接受客户端的数据也可以给客户端反馈数据
在客户端中要先定义Socket对象把你要传输的ip和端口写入其中,在定义io输入流来读取要传输
的数据和定义io输出流来发送数据,其中Reader是读取数据而Writer是发送数据 最后可以再定义
一个输入流来读取用户端反馈的信息
服务端:定义ServerSocket对象写入端口号,在用ServerSocket对象中accept方法获取Socket对象
然后就是定义io流了 先定义输入流来读取客户端发送的数据 在这里如果是字节流那么就
要先定义byte数组,和一个int变量来拿到数组的长度 如果是字符流就定义String来接收
如果要输出就再把它放入到一个byte数组中
一般的情况下会把UDP中发送端和接收端通过实现Runnable来创建线程可以多次传输,在TCP中也可以把服务端
建立线程 可以实现一个服务端对应多个客户端的请求,这也是现在网站浏览的框架
补充:telnet--windows上用于连接远程服务端命令
代码:
功能:用UDP协议来实现多次传输
-----------------------------华丽丽的分割线------------------------
/**
* 功能:用UDP协议来进行多次传输
*/
package com.text8;
import java.net.*;
import java.io.*;
public class Text4 {
public static void main(String args[])throws Exception{
//在主体函数中启动线程
new Thread(new Fasong(new DatagramSocket())).start();
new Thread(new Jieshuo1(new DatagramSocket(54545))) .start();
}
}
class Fasong implements Runnable{
private DatagramSocket ds;
public Fasong(DatagramSocket ds){
this.ds=ds;
}
public void run(){
//定义输入流来读取输入到键盘上的值
BufferedReader buf=
new BufferedReader(new InputStreamReader(System.in));
while(true){
try {
byte[] as=(buf.readLine()).getBytes();
//定义DatagramPacket对象给192.168.0.12传输数据
DatagramPacket dp=
new DatagramPacket(as,as.length,InetAddress.getByName("192.168.0.12"),54545);
if("886".equals(as)){
break;
}
//使用send方法进行传输
ds.send(dp);
} catch (Exception e) {
e.printStackTrace();
}
}
//关闭DatagramSocket对象
ds.close();
}
}
//接收端
class Jieshuo1 implements Runnable{
private DatagramSocket ds;
public Jieshuo1(DatagramSocket ds){
this.ds=ds;
}
public void run(){
//用byte数组来接收发送端发送的数据 (不能大于64k)
byte[] arr=new byte[1024];
DatagramPacket dp=new DatagramPacket(arr,arr.length);
try {
while(true){
//用receiveff接收
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int prot=dp.getPort();
//从dp中拿到数据并输出在控制台上
System.out.println("IP为"+ip+"数据为"+data+"端口号为"+prot);
}
} catch (IOException e) {
e.printStackTrace();
}
ds.close();
}
}
--------------------------------华丽丽的分割线--------------------------------
TCP协议:
/**
* 功能:使用TCP实现用户名登陆
* 1.客户端通过键盘输入用户名 服务端对这个用户名进行验证
* 2.如果登陆存在 则在 服务器上显示*** 已登录 在客户端显示*** 欢迎你
* 3.如果该用户不存在存在, 在服务端显示**** 正在尝试登陆
* 在客户端上显示*** 该用户不存在
* 4.最多只能登陆3次
*
*/
package com.text7;
import java.io.*;
import java.net.*;
public class Text9 {
public static void main(String args[]) throws Exception{
Socket s=new Socket("192.168.0.12",9852);
//定义输入流来拿到键盘上的值
BufferedReader buf=
new BufferedReader(new InputStreamReader(System.in));
//定义输出流来给服务端发送数据 --用户名
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
//定义输入流来获取服务端发送的数据
BufferedReader buff=
new BufferedReader(new InputStreamReader(s.getInputStream()));
//用循环来控制发送次数
for(int i=0;i<3;i++){
String as="";
if(as==null){
break;
}
pw.println(as);
String as1=buff.readLine();
System.out.println(as1);
//如果服务端发来有“欢迎”字眼说明登陆成功
if(as1.contains("欢迎")){
break;
}
}
//关闭键盘输入流
buf.close();
//关闭socket对象
s.close();
}
}
//声明线程用来可以接受多个客户端的数据
class Duodian implements Runnable{
private Socket s;
public Duodian(Socket s){
this.s=s;
}
public void run(){
for(int i=0;i<3;i++){
try {
//定义输入流来拿到客户端的数据
BufferedReader buf=
new BufferedReader(new InputStreamReader(s.getInputStream()));
// 定义输入流来拿到本机上的数 好和客户端的数据进行比较
BufferedReader buff=
new BufferedReader(new FileReader("d:\\synchronized.txt"));
//定义输出流来给客户端反馈数据
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
//拿到并输出连接的客户端IP
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip="......connected");
String as="";
String name=buf.readLine();
//定义一个标记用来判断
boolean flot=false;
while((as=buf.readLine())!=null){
if(name.equals(as)){
flot=true;
break;
}
}
if(flot){
System.out.println(name+"已登录");
out.println("欢迎光临"+name);
break;
}else {
System.out.println(name+"正在尝试登陆");
out.println(name+"不存在");
break;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("判断失败!");
}
}
}
}
class ServerText9{
public static void main(String args[]) throws Exception{
ServerSocket ss=new ServerSocket(9852);
while(true){
Socket s=ss.accept();
//启动服务端线程
new Thread(new Duodian(s)).start();
}
}
}
希望看的各路好友多提宝贵意见!让我可以查漏补缺~~
------------------------- android培训、java培训、期待与您交流! ----------------------