黑马程序员——java中的网络

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

网络编程

1 网络编程基本概念,TCP/IP协议简介

网络基础知识

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地,而IP是给因特网的每一台电脑规定一个地址,它们之间的尊则就是TCP/IP协议。在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
  
2.网络通讯三要素:
  1.IP地址
  2.端口号  主机上这么多应用程序,数据怎么发送到指定的应用程序上的呢?所以为了标识这些应用层序
     给这些应用程序都用数字进行了标识,就是端口(逻辑端口)。
  3.传输协议  你玩网游的为什么能和外国的同志一起玩啊,什么韩服台服,那就是因为你们通讯的数据都
      遵循了同一个规则,这个通讯规则称为协议。国际组织定义通用协议为TCP/IP。

3.两类传输协议:TCP;UDP

TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是安全无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。
  UDP是User Datagram Protocol的简称,是一种无连接的不可靠的,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

 

UDP传输的示例代码:

/*
UDP发送端:
1.创建Socket服务,通过DataagramSocket
2.封装成数据包
3.发送数据
4.关闭资源
*/
import java.io.*;
import java.net.*;
class udpSend 
{
 public static void main(String[] args) throws Exception
 {
  //1.建立DataGramSocket服务
  DatagramSocket ds = new DatagramSocket();
  //2.封装数据包

  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String line = null;
  while((line=br.readLine())!=null)
  {
   byte[] buf = line.getBytes();
   DatagramPacket dp = new 
    DatagramPacket(buf,0,buf.length,InetAddress.getByName("180.213.63.40"),10000);
   //3.发送数据 
   ds.send(dp); 
  }
  
  //4.关闭资源
  ds.close();
 }
}
/*
UDP接收端:
1.创建Socket服务
2.第一数据包
3.接收数据
4.根据数据包的属性,得出相应的ip,数据,端口
*/
class udpRece
{
 public static void main(String[] args) throws Exception
 {
  //1.创建Socket服务
  DatagramSocket ds = new DatagramSocket(10000);
  
  while(true)
  {
   //2.建立数据包
   byte[] buf = new byte[1024];
   //3.接收数据
   DatagramPacket dp = new DatagramPacket(buf,0,buf.length);
   ds.receive(dp);
   String ip = dp.getAddress().getHostAddress();
   String data = new String(dp.getData(),0,dp.getLength());
   int port = dp.getPort();

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

TCP演示代码:

/*
需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务单会将文本转成大写在返回给客户端。
而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。

分析:
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据。可以选择字符流。

步骤
1,建立服务。
2,获取键盘录入。
3,将数据发给服务端。
4,后去服务端返回的大写数据。
5,结束,关资源。

都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。


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

class  tcpClien
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("180.213.63.40",10000);


		//定义读取键盘数据的流对象。
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(System.in));


		//定义目的,将数据写入到socket输出流。发给服务端。
		//BufferedWriter bufOut = 
			//new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);



		//定义一个socket读取流,读取服务端返回的大写信息。
		BufferedReader bufIn = 
			new BufferedReader(new InputStreamReader(s.getInputStream()));

		String line = null;
		
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			
			out.println(line);
//			bufOut.write(line);
//			bufOut.newLine();
//			bufOut.flush();

			String str =bufIn.readLine();
			System.out.println("server:"+str);
			
		}

		bufr.close();
		s.close();


	}
}
/*

服务端:
源:socket读取流。
目的:socket输出流。
都是文本,装饰。



*/

class  tcpServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(10000);

		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"....connected");

		//读取socket读取流中的数据。
		BufferedReader bufIn =
			new BufferedReader(new InputStreamReader(s.getInputStream()));

		//目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
		//BufferedWriter bufOut = 
			//new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);

		String line = null;
		while((line=bufIn.readLine())!=null)
		{

			System.out.println(line);

			out.println(changeString(line));
//			bufOut.write(line.toUpperCase());
//			bufOut.newLine();
//			bufOut.flush();
		}

		s.close();
		ss.close();

	}
	public static String changeString(String str){
		//1.将字符串变成数组
		char[] ch = str.toCharArray();
		//2.将字符翻转
		for(int y = ch.length-1,x = 0;x < y;x++,y--){
			char temp = ch[y];
			ch[y] = ch[x];
			ch[x] = temp;
		}
		
		return new String(ch);
	}
}




 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值