黑马程序员--网络编程

---------------------- JavaEE+Android开发JavaEE+Android培训、期待与您交流! ----------------------

网络编程
IP地址:InetAddress
• 网络中设备的标识
• 不易记忆,可用主机名
• 本地回环地址:127.0.0.1  主机名:localhost

端口号
• 用于标识进程的逻辑地址,不同进程的标识
• 有效端口:0~65535,其中0~1024系统使用或保留端口。

传输协议
• 通讯的规则
• 常见协议:TCP,UDP


UDP
• 将数据及源和目的封装成数据包中,不需要建立连接
• 每个数据报的大小在限制在64k内
• 因无连接,是不可靠协议
• 不需要建立连接,速度快

TCP
• 建立连接,形成传输数据的通道。
• 在连接中进行大数据量传输
• 通过三次握手完成连接,是可靠协议
• 必须建立连接,效率会稍低


UDP
(1)UDP传输
发送端:
1,创建udp服务。通过DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888);
2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
byte[] buf = "udp ge men lai le ".getBytes();
DatagramPacket dp = 

new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);

 3,通过socket服务,将已有的数据包发送出去。通过send方法。

ds.send(dp);
4,关闭资源。
ds.close();
接收端:
1,创建udp socket,建立端点。
DatagramSocket ds = new DatagramSocket(10000);
while(true)
{
2,定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);

3,通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//阻塞式方法。

4,通过数据包的方法获取其中的数据。
String ip = dp.getAddress().getHostAddress();

String data = new String(dp.getData(),0,dp.getLength());

int port = dp.getPort();

System.out.println(ip+"::"+data+"::"+port);

}
5,关闭资源
ds.close();
(2)数据源由给定字符串变为键盘输入,目的不变
DatagramSocket ds = new DatagramSocket();

		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));

		String line = null;

		while((line=bufr.readLine())!=null)
     {
			if("886".equals(line))
				break;

			byte[] buf = line.getBytes();

			DatagramPacket dp = 
				new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10001);

			ds.send(dp);
		}
		ds.close();
	}


TCP
(1)TCP传输
客户端:
 1,创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.1.254",10003);
 2,为了发送数据,应该获取socket流中的输出流。
OutputStream out = s.getOutputStream();
out.write("tcp ge men lai le ".getBytes());
s.close();
服务器端:
 1,建立服务端socket服务。并监听一个端口。
ServerSocket ss = new ServerSocket(10003);

 2,通过accept方法获取连接过来的客户端对象。
while(true)
{
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");

 3,获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端.
}
//ss.close();
}
(2)客户端跟服务器端的互访
      由于客户端和服务器端建立连接之后,在服务器端就会产生与客户端相对应的对象,来处理客户端,
   1,建立socket服务。指定要连接主机和端口。
   2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。
   3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。
   4,关闭客户端资源。
(3)文本转化服务器
   需求:建立一个文本转换服务器。
   客户端给服务端发送文本,服务单会将文本转成大写在返回给客户端。
   而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据。可以选择字符流
客户端:
1,建立服务。
2,获取键盘录入。
3,将数据发给服务端。
4,后去服务端返回的大写数据。
5,结束,关资源。
都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。
服务端:
源:socket读取流。
目的:socket输出流。
都是文本,装饰。
(4)上传图片
    客户端:
1,服务端点。
2,读取客户端已有的图片数据。
3,通过socket 输出流将数据发给服务端。
4,读取服务端反馈信息。
5,关闭。
    服务器端:
这个服务端有个局限性。当A客户端连接上以后。被服务端获取到。服务端执行具体流程。
这时B客户端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以
暂时获取不到B客户端对象。
那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。


(5)浏览器和Tomcat服务器
   三种类型:
1,
客户端:浏览器 (telnet)
服务端:自定义。

2,
客户端:浏览器。
服务端:Tomcat服务器。

3,
客户端:自定义。(图形界面)
服务端:Tomcat服务器。

(6)URL类
   具有的方法:
String getFile() 
 获取此 URL 的文件名。 
String getHost() 
 获取此 URL 的主机名(如果适用)。 
String getPath() 
 获取此 URL 的路径部分。 
int getPort() 
 获取此 URL 的端口号。 
String getProtocol() 
 获取此 URL 的协议名称。 
String getQuery() 
 获取此 URL 的查询部 
   使用URL完成TCP的传输
URL url = new URL("http://192.168.1.254:8080/myweb/demo.html");
		URLConnection conn = url.openConnection();
		System.out.println(conn);		
		InputStream in = conn.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf,0,len));

---------------------- JavaEE+Android开发JavaEE+Android培训、期待与您交流! ----------------------

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值