一个简单的Socket例子其实可以看出很多问题,之前一直做这样的实验没有成功,今天又试了几遍,不断调试改进,对Socket大致有了一定的了解。
这个例子分为两个部分:服务端与客户端。
服务端用于启动一个进程,并且监听某一个端口,用accpe方法t进行阻塞,此时若accept接收到一个指向这个主机的这一个端口号,则accept运行并创建一个线程执行业务过程,线程一旦创建,进程又回到阻塞状态继续监听后续的请求。
客户端则用于发送指向某一个主机某一个端口号的请求。
服务端代码:
//Server.java package com.llb.server; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Server { private static Connection conn = null; public Server(){ System.out.println("Server is running !"); try { Class.forName("com.mysql.jdbc.Driver"); try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/snjxc", "root", "root"); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } class ServerDemo extends Thread{ Socket socket; InputStreamReader in; PrintWriter out; String username; private Statement prestat = null; private ResultSet rs = null; public ServerDemo(Socket s){ this.socket = s; } @SuppressWarnings("unused") @Override public void run() { System.out.println("Run now!"); char[] bytes = new char[64]; try{ in = new InputStreamReader(socket.getInputStream()); int len = 0; StringBuffer sbr = new StringBuffer(); while((len = in.read(bytes))!= -1){ sbr.append(bytes); if(sbr.toString().lastIndexOf("===END===")>0) break; } String str = sbr.toString(); if(null != str){ str = str.substring(str.lastIndexOf("===BEGIN===")+11, str.lastIndexOf("===END===")); } System.out.println(str); if(null != str){ prestat = conn.createStatement(); rs = prestat.executeQuery("select * from tb_user"); if(rs.next()){ username = rs.getString("username"); } } out = new PrintWriter(socket.getOutputStream(),true); out.print(Server.class.getSimpleName()+" : " + username); out.flush(); }catch (Exception e){ e.printStackTrace(); }finally{ try { in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } @SuppressWarnings("resource") public static void main(String[] args){ ServerSocket ss; Server server; try { ss = new ServerSocket(7501); server = new Server(); while(true){ try{ Socket socket = ss.accept(); server.new ServerDemo(socket).start(); }catch(Exception ee){ ee.printStackTrace(); } } } catch (IOException e) { e.printStackTrace(); } } } //程序的第56~59行,用了一个while以64字节为单位循环从输入流中读入并到bytes中。这样做的好处是可以让程序自主控制何时结束接收过程。 //注意:如若这个读入的过程不能结束,则整个线程将会处于持续的阻塞中不能往下执行。 //这也同时提醒了如果你的程序用readLine(),则你的请求字符串中一定要有断行标志,即\r\n结尾,不然后续代码是不会执行的。
很简单,服务端main方法里强制循环并用accept阻塞进程的自执行,若讲求到达,则创建一个线程,主进程继续阻塞。线程里主要定义了接收的方法,及业务流程,最后返回处理结果。
客户端代码:
//Client.java package com.llb.client; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { public Client(){ Socket socket; PrintWriter out; InputStreamReader in ; System.out.println("Starting...."); try{ socket = new Socket("127.0.0.1",7501); out = new PrintWriter(socket.getOutputStream()); StringBuffer sbr = new StringBuffer("===BEGIN==="); //Append the message you want to send here sbr.append("Client : Son of bitch , can you give me a reply ?"); sbr.append("===END==="); //Send the request out.print(sbr.toString()); out.flush(); //Receive message from server in = new InputStreamReader(socket.getInputStream()); StringBuffer response = new StringBuffer(); @SuppressWarnings("unused") int len = 0; char[] c = new char[1]; while((len = in.read(c)) != -1){ response.append(c); } String str = response.toString(); System.out.println(str); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args){ new Client(); } }
socket = new Socket("127.0.0.1",7501);//创建请求的地址
运行结果:
Server开始运行,并在accept阻塞监听7501端口
启动Client端向服务器发送一个请求,服务器返回admin
服务器收到客户发来的请求并显示消息:
持续更新可参见我在GitHub的版本:https://github.com/Derrick-Li/Greeting/tree/master/socket
相关推荐
在这个“socket简单应用——一个可异机聊天的程序”中,我们将探讨如何利用Socket进行简单的客户端-服务器架构的聊天程序设计。 首先,我们要了解Socket的基本概念。Socket在操作系统层面上是一个通信端点,它允许...
本篇文章将围绕“Socket简单应用”这一主题,深入讲解Socket的基本概念、工作原理以及如何在实际项目中进行应用。 1. Socket基础 Socket在计算机网络中扮演着桥梁的角色,它连接了不同网络设备上的应用程序,使得...
在本示例中,我们将探讨一个简单的Socket应用,该应用包括服务端和客户端,它们通过标准输入输出(控制台)进行交互。 首先,我们要了解Socket的基本概念。Socket,通常被称为套接字,是操作系统提供的一个接口,...
包含C语言完整的socket简单c/s通信代码,有tcp连接的,也有UDP连接的,有多线程实现还有单线程实现,可供比较。还有domain socket c/s通信简单应用的完整代码 C语言 socket tcp/ip domain socket 代码
本主题将深入探讨一个简单的Java Socket服务器应用,旨在帮助初学者理解和掌握Socket通信的基本概念和实现方式。 首先,我们需要了解什么是Socket。Socket是网络通信中的一个重要概念,可以被视为两台计算机之间的...
在这个"socket简单实现程序"中,我们将探讨如何使用Socket在两台电脑之间构建基本的通信链路,以及涉及到的相关知识点。 首先,Socket是网络编程的基础,它提供了一种在网络中不同进程间通信的接口。在TCP/IP协议栈...
总结来说,"C# Socket简单聊天"项目展示了如何利用C#的Socket类实现基于WinForm的双向聊天应用。通过理解和实践这个项目,开发者可以深入理解Socket编程的基本原理,为构建更复杂的网络应用打下坚实的基础。
本文将深入探讨Android中如何简单地使用Socket进行TCP通信。 首先,理解Socket的基本概念至关重要。Socket,也被称为套接字,是网络编程中的一个抽象接口,它允许应用程序通过网络发送和接收数据。在TCP/IP模型中,...
在C# .NET环境中,Socket是用于网络通信的基础组件...这个框架不仅适用于简单的数据传输,还可以用于更复杂的场景,如分布式系统、实时通信应用等。在实际开发中,根据项目的具体需求,可以进一步完善和优化这个框架。
本篇文章将深入探讨"C# socket简单实例",帮助新手快速掌握如何使用C#进行Socket编程。 Socket,通常被称为套接字,是网络编程中的一个抽象概念,它为进程间的通信提供了一个标准接口。在C#中,System.Net命名空间...
socket c/s聊天(客户端) 根据基础tcp/ip知识编写的一个简单聊天程序。使用多线程技术。 可实现多人在线通信
本压缩包文件“delphi socket通信简单应用,(井字棋,三字棋)”显然是一个基于Delphi实现的Socket通信示例,它可能包含了如何创建简单的网络连接,以及如何通过网络进行游戏(如井字棋和三字棋)的交互。...
在UDP Socket编程中,过程相对简单,因为没有连接的概念: 1. **创建Socket**:与TCP类似,使用`socket()`函数创建Socket。 2. **地址解析**:同样使用`getaddrinfo()`函数解析地址。 3. **发送数据**:使用`...
### Socket连接池的简单应用 #### 一、引言 在网络通信中,Socket作为一种基本的通信方式被广泛应用。然而,在实际开发过程中,直接使用系统自带的Socket库可能会遇到各种复杂性和性能上的挑战。例如,频繁地建立...
Java Socket 简单成绩管理系统是一个基于JAVA编程语言和Socket通信技术实现的初级项目,它主要目的是帮助初学者理解如何运用Socket进行网络通信,并在实际应用中管理学生的成绩。在这个系统中,通常会包含服务器端...
"VCsocket的简单应用"这个主题主要关注的是使用Visual C++(VC++)进行Socket编程,它是Windows环境下开发网络应用程序的一种常见方式。Socket编程允许程序通过网络进行通信,而VC++提供了便利的API接口来实现这一...
Socket编程是计算机网络编程中的重要组成部分,主要用于实现不同设备或进程间的通信。..."socket简单测试"就是一个很好的实践,通过编写和运行这段代码,你可以深入理解Socket的工作原理以及如何在实践中应用。
【标题】"SOCKET简单聊天实例.rar"是一个用于学习TCP SOCKET编程的基础教程资源,它包含了一个简单的聊天应用程序的源代码,适用于初学者。通过这个实例,开发者可以了解如何使用SOCKET进行网络通信,构建基本的...
在VS2013环境下,我们可以通过以下步骤创建一个简单的Socket通信应用: 1. **创建MFC项目**:打开Visual Studio 2013,选择“新建项目”,在MFC类别下创建一个基于对话框的应用程序。 2. **添加CAsyncSocket成员...
二、C# Socket简单案例 下面是一个简单的C# Socket客户端和服务端的交互示例: 服务端(Server): ```csharp using System; using System.Net; using System.Net.Sockets; class Server { static void Main() { ...