网络编程(第一天)--TCP网络编程

本文详细介绍Java网络编程的基础知识,包括TCP/IP协议、Socket编程、多线程处理等核心概念,并通过具体实例展示如何搭建服务器与客户端进行数据交互。

声明:由于学习所用环境为JDK1.8,所有Java代码均在JDK1.8中测试通过,如果环境发生变化,可能会有错误发生!

一、计算机网络介绍

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和 信息传递的计算机系统。

1、计算机网络分类

虽然网络类型的划分标准各种各样,但是从地理范围划分是一种大家都认可的通用网络划分标准。按这种标准可以把各种网络类型划分为局域网、城域网、广域网三种。
局域网:一般来说只能是一个较小区域内
城域网:是不同地区的网络互联,不过在此要说明的一点就是这里的网络划分并没有严格意义上地理范围的区分,只能是一个定性的概念。
广域网:所覆盖的范围比城域网(MAN)更广,它一般是在不同城市之间的LAN或者MAN网络互联,地理范围可从几百公里到几千公里,Internet就是一种广域网

2、网络参考模型


二、TCP/IP协议

TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族
在TCP/IP协议中,最重要的协议是TCP、UDP、IP协议
1、TCP协议(Transmission Control Protocol)

TCP是基于面向连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接
TCP协议建立连接需要三次会话(握手)
A->B
B->A
A->B
特点:
面向连接
安全,可靠
效率相对较低
数据大小无限制

2、UDP协议(User Datagram Protocol)

UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。
UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证
特点
无连接
可靠性不高
效率高
每次最大传输64KB

3、IP协议

IP的责任就是把数据从源传送到目的地。它不负责保证传送可靠性,流控制,包顺序和其它对于主机到主机协议来说很普通的服务。
IP协议中还有一个非常重要的内容,那就是给因特网上的每台计算机和其它设备都规定了一个唯一的地址,叫做“IP 地址”。

4、IP地址(Internet  Protocol)
唯一标识网络上的每一台计算机
IP地址的组成
32位,由4个8位二进制数组成
5、配置IP地址,检测网络是否畅通
查看本机的IP地址:ipconfig
测试网络是否通畅:ping目标主机ip地址

6、端口号

端口号:具有网络功能的应用软件的标识号
端口是一个软件结构,被客户程序或服务程序用来发送和接收数据,一台服务器有256*256个端口。
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的
1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。
端口与协议有关:TCP和UDP的端口互不相干。

7、网络服务器
通常指在网络环境下,具有较高计算能力,能够提供用户特殊服务功能的计算机

三、Socket(套接字)介绍

通信链路的端点就被称为“套接字”(英文名Socket)
是提供给应用程序的接口

1、Socket套接字

两个应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。
Socket通常用来实现client-server(客户端-服务端)连接,建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port Number)。

2、网络编程的四个基本步骤

(1)创建socket;
(2)打开连接到socket的输入/输出流(通过Socket的getInputStream()和getOutputStream());
(3)按照一定的协议对socket进行读/写操作;
(4)关闭socket;
3、基于TCP协议的Socket编程
(1)基于TCP协议的Socket网络通信
用来实现双向安全连接网络通信
TCP Socket通常用来实现client-server连接,建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port Number)
(2)TCP Socket通信模型
进行网络通信时,Socket需要借助数据流来完成数据的传递工作。

package socket;

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

public class Server {

	public static void main(String[] args) {
		ServerSocket server=null;
		Socket socket=null;
		OutputStream out=null;
		try {
			System.out.println("服务器端等待连接***");
			server=new ServerSocket(6666);
			socket=server.accept();
			out=socket.getOutputStream();
			out.write("hello,welcome to socket programming!".getBytes());
			System.out.println("发送成功!");
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				socket.close();
				server.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
package socket;

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

public class Client {

	public static void main(String[] args) {
		Socket socket=null;
		InputStream input=null;
		try {
			socket=new Socket("localhost",6666);
			input=socket.getInputStream();
			byte[] b=new byte[1024];
			int len=input.read(b);
			System.out.println("读到的信息是:"+new String(b,0,len));
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

4、多线程处理请求

package picsocket;

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

public class Server {

	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		int count = 0;
		try {
			server=new ServerSocket(9999);
			while(true){
				count++;
				socket=server.accept();
				System.out.println("服务器等待"+count+"连接");
				new Thread(new PicRunnable(socket)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}
package picsocket;

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

public class PicRunnable implements Runnable {
	private Socket socket;
	InputStream input=null;
	OutputStream out=null;
	public PicRunnable(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		try {
			String fileName=System.currentTimeMillis()+".jpg";
			input=socket.getInputStream();
			out=new FileOutputStream("c:"+File.separator+fileName);
			 byte[] b=new byte[1024];
			    int len=0;
			    while((len=input.read(b))!=-1){
			    	out.write(b,0,len);
			    }
			    System.out.println(Thread.currentThread().getName()+"接收成功!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
package picsocket;

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

public class Client {

	public static void main(String[] args) {
		Socket socket=null;
		OutputStream out=null;
		InputStream input=null;
		try {
			socket=new Socket("localhost",9999);
			input=new FileInputStream("e:"+File.separator+"Picture"+File.separator+"4.jpg");
			out=socket.getOutputStream();
			byte[] b=new byte[1024];
			int len=0;
			while((len=input.read(b))!=-1){
				out.write(b,0,len);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				input.close();
				out.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
课堂练习:echo回声
package echo;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		ServerSocket server=null;
		Socket socket=null;
		int count=0;
		try {
			server=new ServerSocket(6666);
			while(true){
				count++;
				System.out.println(count+"服务器正在等待。。。");
				socket=server.accept();
				new Thread(new Echorunnable(socket)).start();
				}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Echorunnable implements Runnable{
private Socket socket;
public Echorunnable(Socket socket){
	this.socket=socket;
}
	@Override
	public void run() { 
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			PrintStream ps=new PrintStream(socket.getOutputStream());
			while(true){
				String recieve=br.readLine();
				ps.println(recieve);
				if("byebye".equals(recieve)){
					socket.close();
					break;
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package echo;

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

public class Client {

	public static void main(String[] args) {
		Socket socket=null;
		try {
			socket=new Socket("localhost",6666);
			while(true){
				System.out.print("请输入:");
				BufferedReader keybr=new BufferedReader(new InputStreamReader(System.in));
				PrintStream ps=new PrintStream(socket.getOutputStream());
				BufferedReader cbr=new BufferedReader(new InputStreamReader(socket.getInputStream()));
				String keyInput=keybr.readLine();
				ps.println(keyInput);
				String recieve=cbr.readLine();
				System.out.println("服务器端说:"+recieve);
				if("byebye".equals(recieve)){
				     break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

















Java是一种具备卓越性能与广泛平台适应性的高级程序设计语言,最初由Sun Microsystems(现属Oracle公司)的James Gosling及其团队于1995年正式发布。该语言在设计上追求简洁性、稳定性、可移植性以及并发处理能力,同时具备动态执行特性。其核心特征与显著优点可归纳如下: **平台无关性**:遵循“一次编写,随处运行”的理念,Java编写的程序能够在多种操作系统与硬件环境中执行,无需针对不同平台进行修改。这一特性主要依赖于Java虚拟机(JVM)的实现,JVM作为程序与底层系统之间的中间层,负责解释并执行编译后的字节码。 **面向对象范式**:Java全面贯彻面向对象的设计原则,提供对封装、继承、多态等机制的完整支持。这种设计方式有助于构建结构清晰、模块独立的代码,提升软件的可维护性与扩展性。 **并发编程支持**:语言层面集成了多线程处理能力,允许开发者构建能够同时执行多项任务的应用程序。这一特性尤其适用于需要高并发处理的场景,例如服务器端软件、网络服务及大规模分布式系统。 **自动内存管理**:通过内置的垃圾回收机制,Java运行时环境能够自动识别并释放不再使用的对象所占用的内存空间。这不仅降低了开发者在内存管理方面的工作负担,也有效减少了因手动管理内存可能引发的内存泄漏问题。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值