java自学笔记之网络编程

网络编程:

网络编程有两种实现方式:即通过 TCP协议和 UDP协议。

UDP:

属于不可靠的连接,发送数据包之前不会建立连接,不会保证数据报到没到达目的地。
1,面向无连接
2,数据会被封包,包体积有限制64K
3,不可靠
4,速度快
聊天,视频会议,桌面共享都可以作为UDP传输;

TCP:

属于可靠的连接,在发送数据报之前建立连接,采用三次握手原则,可以保证数据能够完整的传输到目的地,因而传输速度也会比较慢。
  1、建立连接,形成传输数据的通道
  2、在连接中进行大数据量传输
  3、通过三次握手完成连接,是可靠协议
  4、必须建立连接,效率会稍低

Socket:
网络通信其实就是Socket间传输;

UDP传输:

DatagramSocket 与DatagramPacket
DatagramSocket建立发送端和接收端的Socket;send(dp)和receive(dp)方法实现对数据的发送和接收;
DatagramPacket封装面向无连接的UDP数据包,构造函数:DatagramPacket(byte[] buf,int length,InetAddress address,int port)等;

udp的发送端:

1:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
2:明确要发送的具体数据。
3:将数据封装成了数据包。
4:用socket服务的send方法将数据包发送出去。
5:关闭资源。

udp的接收端:

1:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。
2:定义数据包,用于存储接收到数据。
3:通过socket服务的接收方法将收到的数据存储到数据包中。
4:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。
5:关闭资源。
/*
编写一个聊天程序
右手数据的部分和发数据的部分
需要多线程同时执行
一个线程控制接受,一个线程控制发送;
*/


import java.net.*;
import java.io.*;

class Send implements Runnable
{
	private DatagramSocket ds;
	public Send(DatagramSocket ds)
	{
		this.ds = ds;
	}
	public void run()
	{
		try{
			BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
			String line = null;
			while ((line = bufr.readLine())!=null) {
			if (line.equals("youxiang")) {
				break;
			}
			byte[] buf = line.getBytes();

			DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),2000);
			ds.send(dp);
		}
		ds.close();
		}catch(Exception e){
			System.out.println("发送失败");
		}
		
	}
}

class Rece implements Runnable
{
	private DatagramSocket ds;
	public Rece (DatagramSocket ds){
		this.ds = ds;
	}
	
	public void run ()
	{
		try{
			byte [] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf,buf.length);

		ds.receive(dp);
		String ip = dp.getAddress().getHostAddress();
		String data = new String (dp.getData(),0,dp.getLength());
		System.out.println(ip+":"+data);
	}catch(Exception e){
		System.out.println("接受失败");
	}
		
	}
}

class ChatDemo{

	public static void main(String[] args) throws Exception{
		
		DatagramSocket sendSocket = new DatagramSocket();
		DatagramSocket receSocket = new DatagramSocket(2000);
		
		new Thread(new Send(sendSocket)).start();

		new Thread(new Rece(receSocket)).start();

	}
}



TCP传输:

Socket与ServerSocket
Socket:建立客户端,  new Socket(地址,端口);
SeverSocket:建立服务器端,  newSeverSocket(端口)

TCP客户端:

1:建立tcp的socket服务,最好明确具体的地址和端口。
2:连接成功后,产生socket流。通过getInputStream和getOutputStream获取socket流中的读取流和写入流。
3:添加数据。
4:关闭资源。
class TcpClient2
{
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1",4000);

		OutputStream  out = s.getOutputStream();

		out.write("hello Server".getBytes());

		InputStream in = s.getInputStream();

		byte [] buf = new byte[1024];

		int len = in.read(buf);

		String data= new String(buf,0,len);
		System.out.println(data);
		s.close();

	}
}


TCP服务端:

1:创建服务端socket服务,并监听一个端口。
2:服务端通过accept()方法获取连接过来的客户端对象。
3:通过获取到的socket对象中的socket流和具体的客户端进行通讯。
4:关闭资源。
注意:要先关客户端,再关服务端。
class TcpServer2
{
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(4000);
		Socket s = ss.accept();

		String ip = s.getInetAddress().getHostAddress();
		InputStream in = s.getInputStream();

		byte[] buf = new byte[1024];
		int len = in.read(buf);

		String data= new String (buf,0,len);
		System.out.println(ip+":"+data);

		OutputStream out = s.getOutputStream();
		out.write("hello client".getBytes());
	
	}
}

URL封装和URLConection封装:

URL代表一个统一资源定位符,它是指向互联网“资源”的指针,资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用
例如:对数据库或搜索引擎的查询。

String getFile():获取此URL的文件名
String getHost():获取此URL的主机名(如果适用)
String getPath():获取此URL的路径部分
int getPort(): 获取此URL的端口号
String getProtocol():获取此URL的协议名称
String getQuery():获取此URL的查询部

class URLConnectionDemo
{
 public static void main(String[] args)throws Exception {
  URL url=new URL("http://www.baidu.com");
  URLConnection conn=url.openConnection();
  InputStream in=conn.getInputStream();
  byte[] buf=new byte[1024];
  int len=in.read(buf);
  System.out.println(new String(buf,0,len));

 }

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值