黑马程序员-----------网络编程

------- 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) {
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值