要进行网络编程,必然要先了解计算机网络通讯的一些基本原理,网络通讯也是一个整体的系统。不了解整个系统是如何运转的又怎么才能很好的理解系统部分设计的合理性呢?现在的网络体系结构基本上都是基于OSI模型的,自顶向下大概分为五层,即应用层、运输层、网络层、链路层、物理层等,但在实际的应用编程中,我们往往接触的只是网络的应用层。其中应用层提供了各种应用于网络数据传输的服务,以此来保障通信的准确无误。所以开发者制定了一系列的通信协议来提供通信服务,其中比较重要的有UDP和TCP;TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快,
总之,在面对什么样的问题时,合适的选择相应的协议。对于计算机网络仅仅了解这些是不够的,以后多看看《计算机网络通信自顶向下方法》这本书,以便更好的了解网络通信世界。
到这里是不是觉得网络编程这么麻烦呢?答案当然不是,要是每个开发人员都要认真走一遍计算机网络的所有知识的话,这简直要疯了。通信的成本这么高,所以我们一方面要能做出让客户耳目一新的产品之外,同时在保证产品质量和用户体验的同时,也要降低开发成本,其实这两者有事一对矛盾体,有效的解决矛盾的统一性问题,才能使事物达到和谐快速的发展。我们建设社会主义不也是这样吗?高举中国特色社会主义的伟大旗帜,解决国内各种矛盾争端,解放生产力。所以在这个伟大的时代封口浪尖中诞生Socket这玩意。
何为Socket ?
Socket 是一个对象,是代表两台机器之间网络连接的对象(java.net.Socket)。很形象一点的说法就相当于我们平时打电话的那根电话线。学术一点,所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
下面具体的列出网络通信的一般步骤做法:
1.通信前要定好通信协议,即应用程序如何和服务器进行会话,严格按照制定的协议进行读取、和发送消息,已达到预期的设计目的、或者服务。
2.创建服务端
// 1.创建一个SercerSocket,使用6666端口监听客户端请求
ServerSocket serverSocket =newServerSocket(6666);
System.out.println("The server is started, listening on port 6666");
while(true)
{
// 2.ServerSocket的accept()在等待用户连接的时候闲置;在用户连接上来的时候, 返回一个Socket来与客户端通信
Socket socket = serverSocket.accept(); //等待客户连接, 阻塞...............
// 3.创建PrintWriter对象,用以接收socket输出流
PrintWriter writer =newPrintWriter(socket.getOutputStream());
// 4.使用PrintWriter对象写出输出数据
String advice ="notifier's blog";
writer.println(advice); //按照事先制定好的协议发送消息
// 5. 关闭连接
writer.close();
}
3 客户端编程:
// 1.创建Socket连接,告知Server的IP地址以及端口号
Socket socket =newSocket("127.0.0.1",6666);
// 2.创建InputStreamReader,用于读取socket输入流
InputStreamReader stream =newInputStreamReader(socket.getInputStream());
// 3.使用BufferedReader链接输入流
BufferedReader br =newBufferedReader(stream);
// 4.读出数据,这里只是一个简单的实列,具体还要根据具体的协议进行收发消息
String line =null;
while((line = br.readLine()) !=null)
{
System.out.println("Today's advice is: "+ line);
}
// 5. 关闭输入流BufferedReader
br.close();
就这样只要稍加整理,一简单的Server-Client模型的程序就写好了,但是这个程序写出来达到我们的目的了吗?显然没有,这能作为初学者调试用,只能说没有达到我们的终极目标,革命尚未成功,同志还需努力。以上的程序最大的弊病就是只能实现一对一的通信,虽然能连接多个客户,但只有一个客服来提供服务,显然不行,会发生错乱。这时候我们就要想了,怎么才能设计出每一个客户对应一个客服呢?答案是坑定的,这就要我们学会用多线程的编程方法,解决并发的问题。多说无益下面给出来多线程处理的代码过程(代码只是一些过程化的描述,并非调试好的代码):
public class MyQqServer {
ObjectInputStream ois;
ObjectOutputStream oos;
boolean isLogin = false;
ShowUI ui ;
public MyQqServer()
{
ui = new ShowUI();
try {
ServerSocket ss=new ServerSocket(9988);
ui.showProcess.append("服务器已成功启动!正在监听用户的登陆....\r\n");
while(true)
{
Socket socket=ss.accept(); //阻塞,等待连接
//当有客户连接到服务器时,就启动一个线程来处理消息收发。
SerConClientThread st = new SerConClientThread (socket);
st.start();
}
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}finally{
}
}
public class SerConClientThread extends Thread{
Socket s;
public SerConClientThread(Socket s)
{
this.s=s;
}
public void run(){
while(true)
{
//这里该线程就可以接收客户端的信息.
try {
//获取socket的输入流
Message m=(Message)ois.readObject();
//判断消息的类型,并根据原先制定好的协议,做出相应的反映
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
}
}
}
有了这些基本的技术点,再借助以前我们学过的知识,我们可以开发网络小应用了,类似于QQ的聊天、网络五子棋、象棋等,和通信相关的应用你是否都已用思路了呢?虽然说这些东西很多人都能做出来,作为我们初学者来说要设计出什么创新很强的应用,可能一下还做不到,但你一定要理解原理,通过练习来达到熟练的程度,我辈并非人人都有得天独厚的慧资,能创造出史无前例、绝无仅有的新事物来,但一定不要和别人做的一样,否者这样就失去了自己,做设计除了练习阶段外,设计出来的东西不说能让别人激动,得先让你自己激动。这样你就能拥有永恒不竭的激情去燃烧设计者的思想和灵魂。让更多的人因你而激动。
在下一片技术博客中,会进一步会结合网络小项目详细的阐述网络编程的一些细节,包括数据的打包、解包、设计模式框架,怎么运用这些技术点实现多人聊天、玩游戏的功能。
分享到:
相关推荐
Java Socket网络编程是Java开发中一个重要...Java Socket编程是构建网络应用的基础,掌握其原理和实践方法对于开发分布式系统、网络服务等至关重要。通过不断实践和学习,开发者可以更熟练地运用Socket来解决实际问题。
在Java中,我们可以使用`java.net.Socket`类和`java.net.ServerSocket`类来实现TCP Socket编程。`ServerSocket`用于监听客户端的连接请求,`Socket`则代表一个客户端连接。以下是一个简单的TCP服务器端和客户端示例...
Java的Socket编程接口提供了丰富的功能,包括错误处理、套接字选项设置等,使得开发者能够构建复杂、可靠的网络应用。同时,Java的异常处理机制也为网络编程提供了良好的健壮性。在实际开发中,还需要考虑线程管理、...
Java Socket编程还涉及许多其他关键概念,例如异常处理、线程同步、数据编码解码、超时设置等。在实际应用中,通常需要考虑以下几点: - **异常处理**:在上述示例中,每个可能抛出异常的操作都被捕获并处理,确保...
Socket编程提供了在不同网络节点间进行数据传输的基础,它是基于TCP/IP协议族的,确保了数据的可靠传输。 首先,我们来理解Socket的基本概念。Socket在计算机网络中可以看作是两个应用程序之间建立通信的端点,它...
首先,我们来深入理解Java Socket编程。Socket是网络通信中的端点,它允许两台计算机(或者网络上的任何其他设备)通过TCP/IP协议进行通信。在Java中,`java.net.Socket`和`java.net.ServerSocket`类是实现Socket...
在Java中,Socket编程是实现网络通信的基本手段,它允许应用程序之间通过网络进行数据交换。本文将详细探讨Java Socket网络编程中的关键知识点。 首先,我们回顾一下网络通信的发展历史。通信技术的发展经历了从...
Java Socket网络编程是Java平台中实现网络通信的基础组件,它提供了低级别的、面向连接的、可靠的字节流通信。在本教程中,我们将探讨如何利用Java Socket构建一个多客户端与单服务器的聊天应用,同时实现客户端之间...
在Socket编程中,必须妥善处理各种网络异常,如`IOException`,确保程序的健壮性。例如,当网络中断或服务器关闭时,需要捕获并适当地处理异常。 7. **阻塞与非阻塞模式** 默认情况下,Socket和ServerSocket操作...
Java Socket网络编程是Java语言中实现网络通信的基础,它提供了低级别的、面向连接的、可靠的字节流服务。在这个基于Java Socket实现的简单模拟QQ聊天程序中,我们主要探讨以下几个核心知识点: 1. **Socket原理**...
Java Socket网络编程是Java开发中实现网络通信的基础,它提供了客户端和服务器端进行数据交换的接口。在Java SDK中,`java.net`包包含了Socket相关的API,使得开发者能够轻松地进行网络编程。 首先,要理解网络编程...
在Java Socket编程中,重要的是理解I/O流的概念,因为数据是以字节流的形式在网络中传输的。同时,为了提高服务器的并发能力,通常会为每个客户端连接创建新的线程或使用线程池来处理请求。在实际项目中,还需要考虑...
在Java Socket编程中,常用的设计模式是客户端/服务器(C/S)结构。服务器端创建ServerSocket,监听特定端口,当客户端通过Socket发起连接请求时,服务器响应并创建新的Socket进行通信。在多线程环境下,服务器可以...
Socket编程是Java网络编程的核心内容之一,其应用范围广泛,包括但不限于即时通讯、文件传输、网络游戏等多个领域。通过本文的学习,开发者可以掌握基于Java Socket的网络编程基础,并将其应用于实际开发项目中。...
在这个五子棋游戏中,Socket编程被用来连接多个玩家,使得他们可以在线对战。 首先,我们要理解Java Socket的基本概念。Socket是网络通信中的一个端点,它允许两个应用通过网络进行数据交换。一个Socket由IP地址和...
Java Socket网络编程是Java开发中的重要组成部分,它允许应用程序通过网络进行通信,实现客户端与服务器之间的数据交换。在本文中,我们将深入探讨Java Socket的基本概念、工作原理以及如何使用Socket进行实际的网络...
在进行Socket编程时,需要处理IOException,因为网络通信过程中可能出现各种错误,如连接超时、网络中断等。合理的异常处理可以确保程序的健壮性。 五、多线程与Socket 在实际应用中,服务器通常需要同时处理多个...
这个实例展示了Java Socket编程的基本流程,包括服务器端的监听、连接、数据交换,以及客户端的连接、发送数据和接收响应。这种模式广泛应用于各种网络应用,如聊天室、文件传输、远程控制等。通过理解这个实例,...
读书笔记:C++&&Java socket网络编程 学习socket 案例快速入手