JAVA基础---网络

1. 网络模型

OSI(Open System  Interconnection)开发系统互联参考模型

TCP/IP 参与模型1.

  1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转换为电流强弱来进行传输、到达目的地址后再转化为1、0,也就是我们常说的数模转换和模数转换)。这一层的数据较比特。
  2. 数据链路层:主要将从物理层接受的数据进行MAC地址(网卡地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
  3. 网络层:主要将下层接受到的数据进行IP地址封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫数据包。
  4. 传输层:定义了一些数据传输的协议和端口号(WWW端口号80等),如TCP、UDP主要将从下层接受的数据进行分段和传输,到达目的地进行重组。常把这一层的数据叫段。
  5. 会话层:通过传输层(端口号:传输端口和接受端口)建立数据传输的通道。主要在你的系统之间发起会话或者接受会话请求(设备之间需要相互认识可以是IP地址也可以是MAC(或者主机名))。
  6. 表示层:主要进行对接受的数据进行解释、加密和解密,压缩和解压等。也就是把计算机能够识别的东西转化为人能够是被的东西(如图片、声音等)。
  7. 应用层:主要是终端的应用,比如FTP、WEE、QQ等。

2.网络通讯要素

2.1 IP地址

网络中设备的标识,不易记忆,可用主机名

本地回环地址:127.0.0.1 主机名:localhost

jiava中的IP类:InetAddress

2.2 端口号

用于标识进程的逻辑地址,不同进程的标识。

有效端口号:0~65535  , 其中0~1024系统使用或保留端口

2.3 传输协议

通讯的规则:

UDP:用户数据包文协议

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

TCP:传输控制协议

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

2.4 TCP/IP:

Socket套接字:

  • Socket就是为网络服务提供一种机制
  • 通信的两端都有Socket
  • 网络通信其实就是Socket之间的通信
  • 数据在两个Socket间通过I/O传输。

2.5 UDP传输:

DatagramerSocket &&DatagramerSocket

Demo1:

发送端:

接收端:

Demo2 基于UDP的聊天程序:

  • 发送线程任务:

  • 接受端线程任务

  • 主函数:

2.6.TCP传输

Demo1:

客户端:

服务端:

Demo2:TCP传输例子

客户端输入字母数据,发送给服务端,服务端把数据打印在控制台上,

并转换成大写发送给服务端,直到客户端输入“over”,转换结束

创建一个英文字母大写转换服务器

分析:有客户端,有服务端,就是TCP传输

  • 客户端:

思路:

1、创建客户端Socket;

2、客户端数据源:键盘

3、客户端目的:server

4、接受服务端的数据:源:socket的输入流

5、服务端的数据的目的:目的:控制台 6、都是文本数据

转换客户端:

1、客户端socket服务

2、获取键盘录人

3、将键盘数据发送到socket流中

  • 服务端:

分析:

1、创建ServerSocket服务

2、获取客户端的Socket对象

3、源:客户端的来自流的数据

4、目的:打印在控制台上

5、将变换成大写的数据发送给客户端

Demo3:文本文件上传

  • 上传文件客户端: 

思路: 
1、 创建客户端Socket服务; 
2、读取客户端文件; 
3、获取Socket的输出流; 
4、将客户端的文件通过输出流发送到服务端
5、读取服务端的返回的数据; 
6、将其打印在控制台上; 
7、关闭流.

public class UploadClient {

	public static void main(String[] args) throws IOException {

		// 1、 创建客户端Socket服务;
		Socket s = new Socket("192.168.1.216", 10009);

		// 2、读取客户端文件;
		BufferedReader bur = new BufferedReader(new FileReader("client.txt"));

		// 3、获取Socket的输出流;
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream(), "utf-8"), true);

		// 4、将客户端的文件通过输出流发送到服务端
		String line = null;
		while ((line = bur.readLine()) != null) {
			pw.println(line);
		}
		s.shutdownOutput();

		// 5、读取服务端的返回的数据;
		BufferedReader burin = new BufferedReader(new InputStreamReader(s.getInputStream()));

		// 6、将其打印在控制台上;
		String str = null;
		str = burin.readLine();
		System.out.println(str);

		// 7、关闭流.
		s.close();
		bur.close();
	}
}
  • 上传文件服务端:

思路:
1、创建服务端的ServerSocket服务;
2、获取客户端的socket对象;
3、获取客户端的数据并保存在文件中;
4、告诉客户端上传成功;
5、关闭流。

Demo4:mp3文件上传

  • 文件上传客户端:
public class UploadpicClient {

	public static void main(String[] args) throws UnknownHostException, IOException {

		// 1、建立客户端的Socket服务
		Socket s = new Socket("192.168.1.216", 10012);

		// 2、获取图片资源
		BufferedInputStream burin = new BufferedInputStream(
				new FileInputStream("F:\\CloudMusic\\罗大佑,黄霑,徐克 - 沧海一声笑.mp3"));

		// 3、获取socket输出流
		PrintStream pso = new PrintStream(s.getOutputStream(), true);

		// 4、将数据写入到输出流
		byte[] buff = new byte[1024];
		int len = -1;
		while ((len = burin.read(buff)) != -1) {
			pso.write(buff, 0, len);
		}
		s.shutdownOutput();

		// 5、获取服务端的返回的数据
		InputStream is = s.getInputStream();
		byte[] buffin = new byte[1024];
		int lenth = is.read(buffin);
		String str = new String(buffin, 0, lenth);
		System.out.println(str);

		// 6、关闭流
		s.close();
		burin.close();
	}
}
  • 文件上传服务端:

Demo 03:多线程实现服务端

  • 线程任务: 
public class TaskDemo implements Runnable {

	private Socket s;

	public TaskDemo(Socket s) {
		super();
		this.s = s;
	}

	@Override
	public void run() {
		int count = 0;
		System.out.println(s.getInetAddress().getHostAddress() + "connnected.......");

		try {
			BufferedInputStream burin = new BufferedInputStream(s.getInputStream());

			File file = new File("serve.mp3");

			// 如果文件不存在
			if (!file.exists())
				file.mkdirs();

			// 如果文件存在
			while (file.exists()) {
				file = new File("serve" + (count++) + ".mp3");
			}

			PrintStream ps = new PrintStream(new FileOutputStream(file), true);

			byte[] buff = new byte[1024];
			int len = -1;
			while ((len = burin.read(buff)) != -1) {
				ps.write(buff, 0, len);
			}

			PrintStream psout = new PrintStream(s.getOutputStream(), true);
			psout.println("上传成功");

			s.close();
			ps.close();

		} catch (Exception e) {
			// TODO: handle exception
		}
	}
}
  • 调用实例:
public class ServerthreadDemo {

	public static void main(String[] args) throws IOException {

		ServerSocket ss = new ServerSocket(10069);
		while (true) {
			Socket s = ss.accept();
			new Thread(new TaskDemo(s)).start();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值