`

Socket 简单应用

 
阅读更多

一个简单的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

  • 大小: 13.2 KB
  • 大小: 21.2 KB
  • 大小: 16.9 KB
分享到:
评论

相关推荐

    socket简单应用---------一个可异机聊天的程序

    在这个“socket简单应用——一个可异机聊天的程序”中,我们将探讨如何利用Socket进行简单的客户端-服务器架构的聊天程序设计。 首先,我们要了解Socket的基本概念。Socket在操作系统层面上是一个通信端点,它允许...

    socket简单应用

    本篇文章将围绕“Socket简单应用”这一主题,深入讲解Socket的基本概念、工作原理以及如何在实际项目中进行应用。 1. Socket基础 Socket在计算机网络中扮演着桥梁的角色,它连接了不同网络设备上的应用程序,使得...

    socket简单应用例子

    在本示例中,我们将探讨一个简单的Socket应用,该应用包括服务端和客户端,它们通过标准输入输出(控制台)进行交互。 首先,我们要了解Socket的基本概念。Socket,通常被称为套接字,是操作系统提供的一个接口,...

    socket简单c/s应用完整代码

    包含C语言完整的socket简单c/s通信代码,有tcp连接的,也有UDP连接的,有多线程实现还有单线程实现,可供比较。还有domain socket c/s通信简单应用的完整代码 C语言 socket tcp/ip domain socket 代码

    一个简单的socket服务器应用

    本主题将深入探讨一个简单的Java Socket服务器应用,旨在帮助初学者理解和掌握Socket通信的基本概念和实现方式。 首先,我们需要了解什么是Socket。Socket是网络通信中的一个重要概念,可以被视为两台计算机之间的...

    socket简单实现程序

    在这个"socket简单实现程序"中,我们将探讨如何使用Socket在两台电脑之间构建基本的通信链路,以及涉及到的相关知识点。 首先,Socket是网络编程的基础,它提供了一种在网络中不同进程间通信的接口。在TCP/IP协议栈...

    C#Socket简单聊天

    总结来说,"C# Socket简单聊天"项目展示了如何利用C#的Socket类实现基于WinForm的双向聊天应用。通过理解和实践这个项目,开发者可以深入理解Socket编程的基本原理,为构建更复杂的网络应用打下坚实的基础。

    Android Socket简单使用

    本文将深入探讨Android中如何简单地使用Socket进行TCP通信。 首先,理解Socket的基本概念至关重要。Socket,也被称为套接字,是网络编程中的一个抽象接口,它允许应用程序通过网络发送和接收数据。在TCP/IP模型中,...

    C# .NET中Socket简单实用框架的使用教程

    在C# .NET环境中,Socket是用于网络通信的基础组件...这个框架不仅适用于简单的数据传输,还可以用于更复杂的场景,如分布式系统、实时通信应用等。在实际开发中,根据项目的具体需求,可以进一步完善和优化这个框架。

    C#socket简单实例

    本篇文章将深入探讨"C# socket简单实例",帮助新手快速掌握如何使用C#进行Socket编程。 Socket,通常被称为套接字,是网络编程中的一个抽象概念,它为进程间的通信提供了一个标准接口。在C#中,System.Net命名空间...

    socket c/s聊天(客户端)

    socket c/s聊天(客户端) 根据基础tcp/ip知识编写的一个简单聊天程序。使用多线程技术。 可实现多人在线通信

    delphi socket 通信简单应用,(井字棋,三字棋)

    本压缩包文件“delphi socket通信简单应用,(井字棋,三字棋)”显然是一个基于Delphi实现的Socket通信示例,它可能包含了如何创建简单的网络连接,以及如何通过网络进行游戏(如井字棋和三字棋)的交互。...

    socket应用小例程源代码

    在UDP Socket编程中,过程相对简单,因为没有连接的概念: 1. **创建Socket**:与TCP类似,使用`socket()`函数创建Socket。 2. **地址解析**:同样使用`getaddrinfo()`函数解析地址。 3. **发送数据**:使用`...

    Socket连接池的简单应用

    ### Socket连接池的简单应用 #### 一、引言 在网络通信中,Socket作为一种基本的通信方式被广泛应用。然而,在实际开发过程中,直接使用系统自带的Socket库可能会遇到各种复杂性和性能上的挑战。例如,频繁地建立...

    java socket 简单成绩管理系统

    Java Socket 简单成绩管理系统是一个基于JAVA编程语言和Socket通信技术实现的初级项目,它主要目的是帮助初学者理解如何运用Socket进行网络通信,并在实际应用中管理学生的成绩。在这个系统中,通常会包含服务器端...

    VCsocket的简单应用

    "VCsocket的简单应用"这个主题主要关注的是使用Visual C++(VC++)进行Socket编程,它是Windows环境下开发网络应用程序的一种常见方式。Socket编程允许程序通过网络进行通信,而VC++提供了便利的API接口来实现这一...

    socket 简单测试

    Socket编程是计算机网络编程中的重要组成部分,主要用于实现不同设备或进程间的通信。..."socket简单测试"就是一个很好的实践,通过编写和运行这段代码,你可以深入理解Socket的工作原理以及如何在实践中应用。

    SOCKET简单聊天实例.rar

    【标题】"SOCKET简单聊天实例.rar"是一个用于学习TCP SOCKET编程的基础教程资源,它包含了一个简单的聊天应用程序的源代码,适用于初学者。通过这个实例,开发者可以了解如何使用SOCKET进行网络通信,构建基本的...

    Socket 学习之 MFC:简单通信

    在VS2013环境下,我们可以通过以下步骤创建一个简单的Socket通信应用: 1. **创建MFC项目**:打开Visual Studio 2013,选择“新建项目”,在MFC类别下创建一个基于对话框的应用程序。 2. **添加CAsyncSocket成员...

    C# Socket简单案例

    二、C# Socket简单案例 下面是一个简单的C# Socket客户端和服务端的交互示例: 服务端(Server): ```csharp using System; using System.Net; using System.Net.Sockets; class Server { static void Main() { ...

Global site tag (gtag.js) - Google Analytics