Java 全面掌握网络编程篇

目录
  • 计算机网络
  • 网络模型
  • 客户机服务器模式(Client/Server)
  • TCP/IP的概念和实现
  • TCP三次握手(Three-way handshake)
  • TCP编程
  • UDP的概念和实现
  • UDP编程
  • TCP和UDP的区别
  • 聊天室
    • 服务器处理线程
    • 客户端处理线程
    • 服务器
    • 客户端
    • 效果

计算机网络

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

网络模型

网络模型一般是指
○ OSI(Open System Interconnection开放系统互连)参考模型
○ TCP/IP参考模型
网络编程 就是用来实现网络互联的不同计算机上运行的程序间可以进行数据交换。
计算机网络之间以何种规则进行通信,就是网络模型研究问题

客户机服务器模式(Client/Server)

●为了实现两台计算机的通信,必须要用一个网络线路连接两台计算机。
● 服务器(Server)是指提供信息的计算机或程序
●客户机(Client)是指请求信息的计算机或程序
●网络用于连接服务器与客户机,实现两者相互通信。

TCP/IP的概念和实现

TCP/IP:Transmission Control Protocol/Internet Protocol的简写。TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

TCP三次握手(Three-way handshake)

所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立连接。
❤ 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)。
❤ 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
❤ 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ETABLISHED(TCP连接成功)状态,完成三次握手。
❤ 完成三次握手,客户端与服务器开始传送数据

TCP编程

套接字(Socket)是使用TCP提供了两台计算机之间的通信机制。
客户端程序创建一个套接字,并尝试连接服务器的套接字。
当连接建立时,服务器会创建一个 Socket 对象。客户端和服务器现在可以通过对
Socket 对象的写入和读取来进行通信。
► 服务端:
创建服务端对象,监听一个端口

ServerSocket ss = new ServerSocket(100);

获取客户端对象

Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();

► 客户端:
创建客户端socket服务,把ip和端口作为地址传进构造函数

Socket s = new Socket("localhost",100);

UDP的概念和实现

UDP(User Datagram Protocol):UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
用户数据包协议(UDP)是网络信息传输的另一种形式,基于UDP的通信与基于TCP的通信不同,UDP的信息传递更快,但不提供可靠的保证。

UDP编程

发送端:
建立udp服务,发送端没有指定端口,会自动分配一个端口
DatagramSocket ds = new DatagramSocket();
定义数据内容,并将数据封装成包
byte[] bt = “hello,udp,我来了”.getBytes();
把要发送的数据和ip、port封装到数据包里
DatagramPacket db = new
DatagramPacket(bt,bt.length,InetAddress.getByName(“192.168.1.105”),10000);
通过udp的socket服务中的功能完成数据包的发送 ds.send(db);
接收端:定义socket服务,监听端口
DatagramSocket ds = new DatagramSocket(10000);
预先定义好一个数据包,用于存储接收到的数据
byte[] bt = new byte[1024];
创建数据包对象,用于接收数据
DatagramPacket dp = new
DatagramPacket(bt,bt.length);
使用socket服务的receive方法将接受到的数据存储到数据包中
ds.receive(dp);
通过数据包对象,获取数据包内容
byte[] data = dp.getData();
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();

TCP和UDP的区别

TCP:
1,面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接时间。
2,TCP传输数据无大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。
3,TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。
UDP:
1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
3,UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行数据传输。

聊天室

服务器处理线程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class ServerTask  implements Runnable{

	private Socket socket;

	public ServerTask(Socket socket) {
		// TODO 自动生成的构造函数存根
		this.socket = socket;

	}

	@Override
	public void run() {
		// TODO 自动生成的方法存根

		//建立通信后所执行的内容

		System.out.println("欢迎【"+socket.getRemoteSocketAddress().toString()+"】进入聊天室");

		//构建读取缓冲
		BufferedReader br =null;
		//http响应写入
		PrintWriter pw = null;

		try {

			//获取客户端输入的信息 字节流缓冲成字符流
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String msg;

			while((msg=br.readLine()) != null) {
				msg = "【"+socket.getRemoteSocketAddress().toString()+"】说"+msg;

				//输出客户端信息
				System.out.println(msg);

				//服务器接收到客户端的消息发送消息给客户端
				Scanner scanner = new Scanner(System.in);
				System.out.println("请输入要发送的信息!");

				pw = new PrintWriter(socket.getOutputStream(),true);
				pw.println("服务器说:"+scanner.nextLine());
				pw.flush();
			}
		}catch (SocketException e) {
			// TODO: handle exception
			System.out.println(socket.getRemoteSocketAddress().toString()+"退出聊天室!");
		}
		catch (Exception e) {
			// TODO: handle exception
		}

	}

}

客户端处理线程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class ClientTask  implements Runnable{

	private Socket socket;

	public ClientTask(Socket socket) {
		// TODO 自动生成的构造函数存根
		this.socket = socket;
	}

	@Override
	public void run() {
		// TODO 自动生成的方法存根

		try {
				while(true) {
					Scanner scanner = new Scanner(System.in);
					System.out.println("请输入要发送的信息");
					//消息发送到服务器

					PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);

					//br.readLine()读取的消息发送到服务器
					pw.println(scanner.nextLine());

					//读取服务器发送的消息
					BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					System.out.println(br.readLine());

				}
		}
		catch (Exception e) {
			// TODO: handle exception
		}

	}

}

服务器

import java.net.ServerSocket;
import java.net.Socket;

import com.qingsu.chat.Task.ServerTask;

public class ChatServer {

	public static void main(String[] args) {
		try {

			//创建服务端对象 监听一个窗口
			ServerSocket serverSocket = new ServerSocket(10622);
			System.out.println("服务器创建成功!端口号"+10622);

			//阻塞 直到有链接返回
			while(true) {
				Socket socket = serverSocket.accept();//获取客户端对象

				//启动一个线程处理该链接

				Thread thread = new Thread(new ServerTask(socket));
				thread.start();

			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

客户端

import java.net.Socket;

import com.qingsu.chat.Task.ClientTask;

public class ChatClient {

	public static void main(String[] args) {
		try {

			//创建客户端socket服务,把ip和端口作为地址传进构造函数
			Socket socket = new Socket("127.0.0.1",10622);

			//启动客户机线程处理
			Thread thread = new Thread(new ClientTask(socket));
			thread.start();

		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

}

效果

到此这篇关于Java 全面掌握网络编程篇的文章就介绍到这了,更多相关Java 网络编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java网络编程UDP协议发送接收数据

    本文实例为大家分享了Java网络编程UDP协议发送接收数据的具体代码,供大家参考,具体内容如下 UDP协议发送数据步骤 A:创建发送端socket对象: B:创建数据,并把数据打包: C:调用socket对象的发送方法发送数据包: D:释放资源 package net; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAd

  • Java网络编程之UDP实现原理解析

    UDP实现通信非常简单,没有服务器,每个都是客户端,每个客户端都需要一个发送端口和一个接收端口.一个客户端向另一个客户端发送消息时,需要知道对方的IP和接收端口,所用到的类为DatagramSocket. DatagramSocket socket =new DatagramSocket(),发送端socket,若不指定端口,系统自动分配 DatagramSocket socket =new DatagramSocket("接收信息端口"),接收端socket,需要指定接收端口 ​ 若

  • Java网络编程之IO模型阻塞与非阻塞简要分析

    目录 1.阻塞I/O模型 2.非阻塞I/O模型 1.阻塞I/O模型 阻塞IO模型是常见的IO模型,在读写数据时客户端会发生阻塞.阻塞IO模型的工作流程为: 1.1在用户线程发出IO请求之后,内核会检查数据是否就绪,此时用户线程一直阻塞等待内存数据就绪: 1.2在内存数据就绪后,内核将数据复制到用户线程中,并返回I/O执行结果到用户线程,此时用户线程将解除阻塞状态并开始处理数据. 典型的阻塞I/O模型的例子为data= socket.read(),如果内核数据没有就绪, Socket线程就会一直阻

  • Java网络编程之入门篇

    目录 一.网络基础 二.网络协议 URL类 一.网络基础 二.网络协议 实现TCP的网络编程 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上 public class TCPTest1 { //客户端 @Test public void client() { Socket socket = null; OutputStream os = null; try { //1.创建Socket对象,指明服务器端的ip和端口号 InetAddress inet = InetAddress.ge

  • Java小白第一次就能看懂的网络编程

    目录 一.网络基础 二.网络协议 URL类 一.网络基础 二.网络协议 实现TCP的网络编程 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上 public class TCPTest1 { //客户端 @Test public void client() { Socket socket = null; OutputStream os = null; try { //1.创建Socket对象,指明服务器端的ip和端口号 InetAddress inet = InetAddress.ge

  • Java 全面掌握网络编程篇

    目录 计算机网络 网络模型 客户机服务器模式(Client/Server) TCP/IP的概念和实现 TCP三次握手(Three-way handshake) TCP编程 UDP的概念和实现 UDP编程 TCP和UDP的区别 聊天室 服务器处理线程 客户端处理线程 服务器 客户端 效果 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统.包括局域网(intrane

  • Java的Socket网络编程基础知识入门教程

    一.TCP/IP简介 TCP/IP协议族是互联网使用的协议,也可以用在独立的专用网络中. TCP/IP协议族包括了IP协议.TCP协议和UDP协议. IP协议使用IP地址来分发报文,但它是尽力而为的服务,报文可能丢失.乱序或者 重复发送.TCP和UDP协议在IP协议基础上增加了端口号,从而在两台主机的应用 程序间建立起透明的连接. 不同的是,TCP协议会对IP层的错误进行修复,它通过握手消息在主机间建立连接, 之后通过在消息中加入序列号来恢复消息中的错误.而UDP只是简单地扩展了IP协议, 使它

  • 简单讲解Java的Socket网络编程的多播与广播实现

    在Java中,我们可以有很多种方法来发送和接收数据.有的方法比较靠近底层,有些问题就需要程序员自己去解决,而有些方法抽象层次比较高,很方便地就可以拿来使用.这些处理数据的方法根据抽象层次由低到高分别有: 1.手动编码:使用位运算逐个自己编码和解析. 2.利用流来自动编码:组合使用OutputStream和ByteArrayOutputStream. 3.序列化:将数据放入一个数据对象中,直接将这个对象序列化后发送. 使用起来很方便,但要注意效率的损失,以及接收方也要使用Java. 4.RMI:将

  • Java之网络编程案例讲解

    Java基础之网络编程 基本概念 IP:每个电脑都有一个IP地址,在局域网内IP地址是可变的. 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信.这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格 式.传输速率.传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换. TCP协议(传输控制协议):是面向连接的传输层协议,应用程序在使用TCP之前,必须先建立TCP连接,在传输数据完毕后,必须释放已经建立的连接(跟打电话是否类似).

  • 详解Java网络编程

    一.网络编程 1.1.概述 1.计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程. 2.Java是 Internet 上的语言,它从语言级上提供了对网络应用程 序的支持,程序员能够很容易开发常见的网络应用程序. 3.Java提供的网络类库,可以实现无痛的网络连接,联

  • 老生常谈Java网络编程TCP通信(必看篇)

    Socket简介: Socket称为"套接字",描述IP地址和端口.在Internet上的主机一般运行多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应于不同的服务.Socket和ServerSocket类位于java.net包中.ServerSocket用于服务端,Socket是建立网络连接时使用的.连接成功时,应用程序两端都会产生一个Socket实例,通过操作这个实例完成所需会话. Socket常用方法: -int getLocalP

  • Java网络编程基础篇之单向通信 原创

    在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单线通信.客户机套接字和服务器套接字链接成功后,可估计通过输出流发送数据,服务器则通过输入流接受数据,下面是简单的单向通信的例子. 实例1:本实例是一个TCP服务器端程序,在 getserver() 方法中建立服务器套接字,调用getClienMessage()方法获取客户端信息.代码如下: import java.io.BufferedReader; import java.io.IOException; impo

  • Java 网络编程socket编程等详解

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节. java.net包中提供了两种常见的网络协议的支持: TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称TCP / IP. UDP:UDP是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要发送的数据的数据包. 本教程

  • Java进阶学习:网络服务器编程

    文章来源:csdn 作者:DaiJiaLin Java的Socket API提供了一个很方便的对象接口进行网络编程.本文用一个简单的TCP Echo Server做例子,演示了如何使用Java完成一个网络服务器. 用作例子的TCP Echo Server是按以下方式工作的: 当一个客户端通过TCP连接到服务器后,客户端可以通过这个连接发送数据到服务端,而服务端接收到数据后会把这些数据用同一个TCP连接发送回客户端.服务端会一直保持这个连接直到客户端关闭它为止. 因为服务器需要能同时处理多个客户端

随机推荐