网络通信

  • 网络通信: 

网络通讯三要素:

1. IP地址: 每台主机都必须有一个唯一的IP地址,IP地址是一个逻辑地址

2.端口号:  端口用一个整数型标识符来表示,即端口号。

            在互联网上传输的数据都包含有用来识别目的地的IP地址和端口号

3.传输协议:网络通讯时的传输规则。

IP协议

UDP协议:面向无连接,传输速度快,数据封装成报传输,每个包不超过64k,传输不可靠;

TCP协议:面向建立连接,可传输大量数据,通过3次握手建立连接,效率稍低,但是传输可靠。

套接字(Socket):

            将应用程序和端口连接起来你,相当于一个“插座”

 UDP连接发送机制:

(1) 先建立发生端的udp服务,通过new  DatagramSocket();

(2)将数据进行封装打包并发生,通过new  DatagramPacket();

(3)通过send()完成发送;

(4)关闭连接;

UDP接收机制:

(1) 先建立发生端的udp服务,通过new  DatagramSocket();

(2)建立用于接收数据的包,new  DatagramPacket();

(3)接收数据,receive();

(4)取出数据并打印;

(5)关闭连接


package mydemo2_3;
import java.net.*;
import java.io.*;
public class SendDemo {

	public static void main(String[] args) {
		DatagramSocket ds=null;
		DatagramPacket dp=null;           //UDP 协议发送端代码
		BufferedReader br=null;
		try {
			ds=new DatagramSocket();
			br=new BufferedReader(new InputStreamReader(System.in));
			String line=null;
			while((line=br.readLine())!=null) {
				byte[] buf=line.getBytes();
				dp=new DatagramPacket(buf,0,buf.length,InetAddress.getLocalHost(),8080);
				ds.send(dp);
			}
		} catch(SocketException e) {
			e.printStackTrace();
		} catch(UnknownHostException e) {
			e.printStackTrace();
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			try {
				ds.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}

	}

}




package mydemo2_3;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveDemo {

	public static void main(String[] args) {
	DatagramSocket ds=null;
	DatagramPacket dp=null;
		try {                                      //UDP 接收端代码
			ds=new DatagramSocket(8080);
			while(true) {
				byte[] buf=new byte[1024];
				dp=new DatagramPacket(buf,buf.length);
				ds.receive(dp);
				String ip=dp.getAddress().getHostAddress();
				int port=dp.getPort();
				String data=new String(dp.getData());
				System.out.println(ip+port+data);
			}
		} catch(SocketException e) {
			e.printStackTrace();
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			try {
				ds.close();
			} catch(Exception e ) {
				e.printStackTrace();
			}
		}
	}

}


​

TCP协议传输机制:

原理是:先建立客户端的Socket服务,通过Socket对象里的in 和out完成读写的作用。当客户端和服务端连接后,服务端有了客户端的Socket对象,用Socket对象里的in  和out完成和它之间的数据传输。

具体方式:

      建立客户端的Socket服务(传输ip和服务端的端口号),通过Socket对象里的getOutputStream() 方法,来写入数据,此时在服务端建立ServerSocket服务(传入端口号),然后调用accept()方法,返回Socket对象,此时用Socket对象中的getInputStream()方法来读取客户端传过来的数据并打印。

​

package mydemo2_3;

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

public class Client {

	public static void main(String[] args) {              //TCP客户端代码
		Socket s = null;
		BufferedReader br = null;
		// BufferedWriter bw=null;
		// BufferedReader br1=null;
		try {
			s = new Socket("192.168.2.100", 23477);
			br = new BufferedReader(new InputStreamReader(System.in));
			// bw=new BufferedWriter(new
			// OutputStreamWriter(s.getOutputStream()));
			PrintWriter out = new PrintWriter(s.getOutputStream(), true);
			BufferedReader br1 = new BufferedReader(new InputStreamReader(
					s.getInputStream()));
			// OutputStream out=s.getOutputStream();
			String line = null;
			while ((line = br.readLine()) != null) {
				if ("over".equals(line)) {
					break;
				}
				// bw.write(line);
				// bw.newLine();
				// bw.flush();
				out.println(line);
				String str = br1.readLine();
				System.out.println("大写:" + str);
			}
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				s.close();
				br.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}


package mydemo2_3;
import java.io.*;
import java.net.*;
public class Server {

	public static void main(String[] args) {
		ServerSocket server=null;
		BufferedReader br=null;
		//BufferedWriter bw=null;                       //TCP服务端代码
		try {
			server=new ServerSocket(23477);
			Socket s=server.accept();
			br=new BufferedReader(new InputStreamReader(s.getInputStream()));
			//bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
			PrintWriter out=new PrintWriter(s.getOutputStream(),true);
			String line= null;
			while((line=br.readLine())!=null) {
				String str=line.toUpperCase();
//				bw.write(str);
//				bw.newLine();
//				bw.flush();
				out.println(str);
			}
		} catch(SocketException e) {
			e.printStackTrace();
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			try {
				server.close();
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		

	}

}

​

 

转载于:https://my.oschina.net/xia0828/blog/889963

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值