------- android培训、java培训、期待与您交流! ----------
需要用到的类:
Socket:
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
ServerSocket:
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
DatagramSocket:
此类表示用来发送和接收数据报包的套接字。(用于udp)
UDP与TCP的区别:
UDP特点:
1.将发送的数据打包;
2.面向无连接,发送时,不关心对方是否接收。
3.每个数据报的大小在限制在64k;
4.因为不需要连接,所以:不可靠。但速度快;
例如:广播电台,电视台发送信号;
TCP特点:
1.发送时,必须建立连接。必须存在接收方,否则不能发送;
2.由于需要建立连接,所以:可靠。但速度(连接速度)会相对慢一些,因为要进行一些连接验证;
下面举例一个使用udp传送数据的案例:
数据发送端:
/*
*发送端:
*
* 1.建立Scanner对象;
* 2.建立DatagramSocket对象;
* 3.从控制台读取一行数据,就封装一个新的数据报,发送;
* 4.当控制台输入886时,结束;
*/
public class UDPSend {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
DatagramSocket socket = new DatagramSocket();
while(true){
System.out.print("请输入信息:");
String info = sc.next();
//封装数据报
DatagramPacket pak = new DatagramPacket(info.getBytes(),info.getBytes().length,InetAddress.getByName("Lenovo-PC"),8888);
//发送数据
socket.send(pak);
//判断是否是886
if(info.equals("886")){
break;
}
}
//释放资源
socket.close();
System.out.println("发送端结束!");
}
}
数据接收端:
/*
* 接收端,只需要循环接收,遇到接收的是886时,结束。
*/
public class UDPReceive {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
byte[] byteArray = new byte[1024];
DatagramPacket pak= new DatagramPacket(byteArray,byteArray.length);
//要多次接收,使用循环
while(true){
socket.receive(pak);
byte[] infoArray = pak.getData();
String info = new String(infoArray,0,pak.getLength());
System.out.println("接收到信息:" + info);
if(info.equals("886")){
System.out.println("对方下线了,我也不玩了,拜拜......");
break;
}
}
//释放资源
socket.close();
}
}
在来一个使用TCP发送和接收文件的案例:
发送端:
public class Client {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while(true){
System.out.print("输入一个文件路径:");
String q=sc.nextLine();
try {
Socket sk=new Socket("127.0.0.1",1333);
BufferedInputStream bfin=new BufferedInputStream(new FileInputStream(q));
BufferedOutputStream bfout=new BufferedOutputStream(sk.getOutputStream());
byte[] bytearr=new byte[1024];
int len=0;
while((len=bfin.read(bytearr))!=-1){
bfout.write(bytearr,0,len);
}
sk.shutdownOutput();
byte[] bytearr1=new byte[10];
InputStream in=sk.getInputStream();
int len1=in.read(bytearr1);
String s=new String(bytearr1,0,len1);
System.out.println(s);
bfin.close();
bfout.close();
in.close();
sk.close();
} catch (IOException e) {
System.out.println("无法连接到服务器");
}
}
}
}
接收端:
public class server {
public static void main(String[] args) {
try {
while(true){
ServerSocket ss=new ServerSocket(1333);
System.out.println("等待连接");
Socket sk=ss.accept();
System.out.println("客户端已连接");
BufferedInputStream bfin=new BufferedInputStream(sk.getInputStream());
BufferedOutputStream bfout =new BufferedOutputStream(new FileOutputStream("E:\\1.avi"));
byte[] bytearr=new byte[1024];
int len=0;
while((len=bfin.read(bytearr))!=-1){
bfout.write(bytearr, 0, len);
}
OutputStream out=sk.getOutputStream();
out.write("上传完毕".getBytes());
bfin.close();
bfout.close();
out.close();
sk.close();
ss.close();
}
} catch (IOException e) {
}
}
}