这2天,看了看网路编程,这里记录一下自己的理解。
网络编程,简单的理解,就是通讯,这里说服务器和客户端的通讯。服务器一直监听着,看是不是有客户来访问。
服务器:相当于一个家,或者一个定点买东西的地方,肯定是需要地址的,不然别人找不到地方对吧。
JAVA 体面提供了InetAddress 对象,通过getByName 等方法,可以获取地址(住址名称)的。
客户端:客户嘛,大家都明白,就是要去和服务器进行回话,相当于我要和你联系,需要你家住址(起码要电话号码之类的,才能找到你)。
地址和端口:地址就不说了,就是能确定你位置一个东东。因为一台服务器,可能有很多服务,这里需要用端口来区分。好比:我到你家买东西,8080 这个端口卖饼干,8081 端口可以卖水果等等。
交互:我作为客户,想到你家买东西,那么我肯定要知道你家地址,我只买饼干,那么我还要知道你家饼干的端口8080.你作为服务器,也就是卖住,你不知道什么人来买,因此你只需要将卖饼干 和买水果的端口打开,派人看着(监听)就行。
JAVA 给我们节省了很多,对于服务器,只需要用ServerSocket 监听端口,有人访问之后有accept()进行允许就行了。对于客户,要用Socket 传入地址(Address) 和端口(PORT)知道你 去哪,买什么。
当然,两边都有了, 当我有地址 有 端口,对你进行访问的时候,肯定得有通道吧,以前可以走路 坐车。现在起码也要卫星信号,才能电话连接对吧。JAVA 这里用了InputStream 和OutputStream ,可以用(Reader 和Writer),通过getInputStream (),getOutputStream ().获得,这就是双方的一个联系通道。
下面我来看看一个简单的程序:
Server 服务器端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static final int PORT = 8080; public static void main(String[] args) throws IOException, InterruptedException { // 服务器现监听一个端口 ServerSocket ss = new ServerSocket(PORT); // 如果同一人访问,就给他开门 Socket s = ss.accept(); try{ // 获取双方的传输通道 BufferedReader in = new BufferedReader( new InputStreamReader( s.getInputStream())); // 这里注意 有个true,表示自动刷新缓冲区 // 如果没有这个,他们就会一直等待信息,没有一行信息就无法进行下面的操作,一直会等到缓冲区满 // 因此用刷新功能,将信息通过网络发送出去,客户端那边一样,信息需要通过网络交互 PrintWriter out = new PrintWriter( new OutputStreamWriter( s.getOutputStream()),true); while(true){ // 获取客户端来的消息,"END" 就退出 String str = in.readLine(); if("END".equals(str)){ break; } System.out.println("str is :"+str); out.println(str); Thread.currentThread().sleep(1000); } }finally{ // 这里为了节省资源,都关闭 s.close(); ss.close(); } } }
Client 客户端:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; public class MyClient { public static void main(String[] args) throws IOException { // 地址,null 表示本地127.0.0.1 InetAddress addr = InetAddress.getByName(null); // 需要的端口 Socket socket = new Socket(addr, 8080); try { System.out.println("socket = " + socket); BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); // 自动刷新 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); // 我假设 说十句话 for (int i = 0; i < 10; i++) { out.println("hello :" + i); String str = in.readLine(); System.out.println(str); } out.println("END"); } finally { socket.close(); } } }
那么同理,我们只需修改一点,就可以完成多个客户端的访问,当然不是并发,这里用了点线程
服务器端线程
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class ServerThread extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; // 服务器端的构造器,需要套接字socket public ServerThread(Socket s) throws IOException { socket = s; in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true); // 启动run start(); } public void run() { String str; try { while (true) { str = in.readLine(); if ("END".equals(str)) { break; } System.out.println("Str is :" + str); out.println(str); } System.out.println("closing..."); } catch (IOException e) { e.printStackTrace(); }finally{ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
客户端线程
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; public class ClientThread extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; private static int counter = 0; private int id = counter++; private static int threadcount = 0; public static int getThreadCount() { return threadcount; } // 客户端的构造,需要地址 public ClientThread(InetAddress addr) { System.out.println("client is :" + id); threadcount++; try { socket = new Socket(addr, 8080); } catch (IOException e) { e.printStackTrace(); } try { in = new BufferedReader(new InputStreamReader(socket .getInputStream())); out = new PrintWriter(new OutputStreamWriter(socket .getOutputStream()), true); start(); } catch (IOException e) { try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } e.printStackTrace(); } } public void run() { try { for (int i = 0; i < 10; i++) { out.println("cliend is :" + id + ":" + i); String str; try { str = in.readLine(); System.out.println(str); } catch (IOException e) { e.printStackTrace(); } } out.println("END"); } finally { try { socket.close(); } catch (IOException e) { threadcount--; } } } }
服务器监听,并创建新的
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class MultiServer { static final int PORT = 8080; public static void main(String[] args) throws IOException { ServerSocket s = new ServerSocket(PORT); System.out.println("Server Started"); try { while (true) { Socket socket = s.accept(); try{ // 每一个访问该端口的,都从新一个线程 new ServerThread(socket); }catch (IOException e) { socket.close(); } } } finally{ s.close(); } } }
模拟多个客户端
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; public class ClientThread extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; private static int counter = 0; private int id = counter++; private static int threadcount = 0; public static int getThreadCount() { return threadcount; } // 客户端的构造,需要地址 public ClientThread(InetAddress addr) { System.out.println("client is :" + id); threadcount++; try { socket = new Socket(addr, 8080); } catch (IOException e) { e.printStackTrace(); } try { in = new BufferedReader(new InputStreamReader(socket .getInputStream())); out = new PrintWriter(new OutputStreamWriter(socket .getOutputStream()), true); start(); } catch (IOException e) { try { socket.close(); } catch (IOException e1) { e1.printStackTrace(); } e.printStackTrace(); } } public void run() { try { for (int i = 0; i < 10; i++) { out.println("cliend is :" + id + ":" + i); String str; try { str = in.readLine(); System.out.println(str); } catch (IOException e) { e.printStackTrace(); } } out.println("END"); } finally { try { socket.close(); } catch (IOException e) { threadcount--; } } } }
小结:从代码上看,其实很简单,以前假设 我是到你家,8080端口去买东西 ,聊天什么的。现在有很多人去你家,同一个端口做事。因此每一个人都创建一个单独的线程,隔离出来就行了。
相关推荐
Socket服务器是等待客户端连接并处理请求的程序。其工作流程大致如下: 1. 创建Socket:服务器首先创建一个ServerSocket对象,指定监听的端口号。 2. 监听连接:调用ServerSocket的accept()方法,进入阻塞状态,等待...
本示例源码提供了C#语言实现的高并发SOCKET服务器和客户端的完整工程实例,这为开发者提供了学习和实践网络通信机制的机会。C#作为一种强大的.NET平台语言,拥有丰富的库支持,使得构建这样的系统变得相对简单。 ...
总结一下,Socket服务器与客户端编程结合链表是一种常见的网络编程模式,特别是在处理并发连接时。通过链表,服务器可以高效地管理多个客户端连接,而Socket则提供了底层的通信机制。改端口可以根据实际需求调整...
在这个项目中,我们将探讨如何使用C++在Visual Studio 2008环境下实现Socket服务器和客户端的基本功能。 首先,Socket在C++中主要是通过`<winsock2.h>`和`<ws2tcpip.h>`这两个库来使用的,它们提供了与操作系统底层...
总的来说,这个"socket客户端,可连接多个服务器"的实现涉及了Socket编程的基础,TCP连接的建立与恢复,以及客户端的错误处理和重连策略。理解这些知识点对于开发分布式系统、网络应用或者其他需要网络通信的项目都...
Java的`java.nio`包提供了非阻塞I/O的支持,可以同时处理多个客户端连接,提高了服务器的并发能力。 总结起来,基于TCP的Socket编程是构建网络应用的基础,涉及网络连接的建立、数据的可靠传输和通信链路的维护。...
Socket编程在IT领域中是网络通信的基础,尤其是在C#中,它提供了强大的工具来构建服务器和客户端应用程序。本文将深入探讨“socket C# 服务器和客户端 图形界面”这一主题,帮助你理解如何利用C#的Socket类创建交互...
在这个主题中,我们将深入探讨Socket服务器和客户端的异步通讯机制。 首先,我们需要理解什么是Socket。Socket是Internet上的进程间通信(IPC)的一种接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在操作...
### Socket服务器和客户端程序知识点详解 #### 一、Socket网络编程概述 Socket是网络通信的基础,它提供了一种进程间通信机制,允许不同计算机上的进程通过网络进行数据交换。在本例中,我们关注的是服务器端与...
当客户端连接成功后,服务器端可以创建一个新的Socket与客户端进行通信,并可以接收和发送数据。 4. **客户端实现**:客户端首先需要建立到服务器的连接,通过指定服务器的IP地址和端口号发起连接请求。连接成功后...
4. **接受连接**:当有客户端连接时,使用`Socket.Accept()`方法接收连接并返回一个新的Socket对象,用于与客户端进行数据交换。 5. **接收和发送数据**:通过`Socket.Receive()`和`Socket.Send()`方法进行数据的...
5. **接受连接**:当有客户端连接时,使用`accept()`方法接收连接请求,并返回一个新的套接字用于后续通信。 ```python client_socket, client_address = server_socket.accept() ``` 6. **接收和发送数据**:通过...
在本文中,我们将深入探讨Socket服务器和客户端通信的基础知识,以及如何利用Socket进行网络通信。 首先,Socket是网络上的两个进程间通信的一种方式,它允许一台计算机(服务器)提供服务,另一台计算机(客户端)...
总之,这个MFC Socket服务器和客户端的单文件Demo是一个很好的学习资源,它涵盖了Socket编程的基本要素,并提供了实践平台,对于希望掌握网络编程的开发者来说,是一份宝贵的资料。通过深入学习和实践,开发者可以更...
这将阻塞直到有新的客户端连接,返回一个新的Socket对象用于与该客户端进行通信。 5. **数据传输**:通过新创建的Socket,服务器和客户端可以使用`Send()`和`Receive()`方法发送和接收数据。这两个方法都是阻塞的,...
本文将深入探讨“Win Socket服务器与客户端”的相关知识点,特别是涉及多线程技术的应用。 首先,我们需要理解Socket的基本概念。Socket是网络编程中的一个抽象概念,它代表了两个进程之间的通信链路。在TCP/IP协议...
在"服务器客户端"的场景中,我们通常会有多个客户端同时连接到服务器。在这种情况下,服务器需要能够处理并发连接,这可能涉及到多线程或者异步I/O。对于C++,可以使用线程池或select/poll/epoll等I/O复用机制来处理...
- 当客户端连接后,`accept()`返回一个新的`Socket`对象,服务器可以通过这个Socket与客户端通信。 - 读取Socket的输入流(`InputStream`)来接收客户端发送的数据。 2. **客户端**: - 创建`Socket`实例,指定...
本示例将深入讲解如何创建一个简单的Socket服务器端和客户端,以帮助理解Java中的网络编程。 首先,我们要了解Socket的基本概念。Socket在计算机网络中扮演着桥梁的角色,它连接了服务器端应用程序和客户端应用程序...