对学习过程中自己敲的一些关于socket有关的代码做了个简单总结,在这分享一下,给有需要的同学借鉴一下。

什么是socket?

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Java就给我们提供了socket,我们只要会使用就可以了,接下来为大家介绍一个简单的socket小例子,完成socket服务和客户端间的通信。
这是我们socket小例子的一个简单架构,由服务端、客户端、线程工作业务逻辑、数据获取类组成。

首先我们先来完成socket服务端的代码开发。

在服务端的main方法里,我们将socketserver对象设置成持久的,并绑定于本机的8899端口上,去接收客户端的socket连接。

package com.wenbing.socket;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ServerSocket;
import java.net.Socket; public class ServiceServer { public static void main(String[] args) throws Exception{
// 创建一个serversocket,绑定到本机的8899端口上
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress("localhost", 8899)); // 接收客户端的连接;accept是一个阻塞方法,会一直等待,到有客户端请求连接才返回
while (true) {
Socket socket = server.accept();
// 每个socket请求都给一个线程来处理
new Thread(new ServiceServerTask(socket)).start(); } } }
 我们定义一个服务端处理客户端请求过来的数据处理线程工作类,让每个请求来的socket都由每一个线程去执行业务逻辑,ServiceServerTask类实行Runnable接口。
package com.wenbing.socket;

import java.io.*;
import java.net.Socket; public class ServiceServerTask implements Runnable { Socket socket;
InputStream inputStream = null;
OutputStream outputStream = null; public ServiceServerTask(Socket socket) {
this.socket = socket;
} // 业务逻辑,跟客户端进行数据交互
@Override
public void run() { try {
// 从socket连接中获取到与client之间的网络通信输入流
inputStream = socket.getInputStream();
// 从socket连接中获取到与client之间的网络通信输出流
outputStream = socket.getOutputStream(); // BufferedReader读取数据是一个字符一个字符读取,遇到回车即停止
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
// 从网络通信输入流中读取客户端发送过来的数据,读取一行,遇到回车即结束
// 注意:socketinputstream的读数据的方法是阻塞的
//读取很多行数据,用while循环读
// String line = "";
// String param = "";
// while (( line = br.readLine()) != null) {
// param = br.readLine();
// System.out.println(param);
// }
String param = br.readLine(); System.out.println(param);
GetDataServiceImpl getDataService = new GetDataServiceImpl();
String result = getDataService.getData(param); // 将调用结果写到socket的输出流中,以发送给客户端
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println(result);
printWriter.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关流,现在是在每个线程里
inputStream.close();
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}

处理数据的方法。

package com.wenbing.socket;

public class GetDataServiceImpl {

    public String getData(String param) {
return "OK-" + param;
} }

接下来就是socket客户端了。客户端和服务端代码基本相同。

package com.wenbing.socket;

import java.io.*;
import java.net.Socket; public class ServiceClient { public static void main(String[] args) throws Exception {
// 向服务器发出请求建立连接
Socket socket = new Socket("localhost", 8899);
// 从socket中获取输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream(); PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println("hello");
printWriter.flush(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String result = bufferedReader.readLine();
System.out.println(result); inputStream.close();
outputStream.close();
socket.close();
} }

简单的socket小例子,送给java小白们。

纸上得来终觉浅,绝知此事要躬行,一定要跟着敲一敲才更容易理解哦。

实现socket的服务和客户端通信的更多相关文章

  1. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  2. 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...

  3. socket,模拟服务器、客户端通信

    服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...

  4. Netty 的基本简单实例【服务端-客户端通信】

    Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象. 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理. Accept连接和读写 ...

  5. 用PHP的socket实现客户端到服务端的通信

    服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...

  6. (C#:Socket)简单的服务端与客户端通信。

    要求:1.可以完成一对一的通信:2.实现服务端对客户端一对多的选择发送:3.可以实现服务端的群发功能:4.可以实现客户端文件的发送: 要点:服务器端:第一步:用指定的端口号和服务器的ip建立一个End ...

  7. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  8. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

    单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #inc ...

  9. C# Socket简单例子(服务器与客户端通信)

    这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信. 注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序.在这个例子中,实际上还有很多问题没有解决,如消 ...

随机推荐

  1. RelativeSource 简述

    原文:RelativeSource 简述 RelativeSource实现标记扩展,以描述绑定源相对于绑定目标的位置. <Binding> <Binding.RelativeSour ...

  2. iOS-HTTP浅析

    HTTP原理 什么是URL URL中常见的几种协议 什么是HTTP协议 HTTP是做什么的 为什么要使用HTTP协议 HTPP协议的通信过程介绍 HTTP请求 HTTP响应 HTTP请求的选择 两种发 ...

  3. Android零基础入门第58节:数值选择器NumberPicker

    原文:Android零基础入门第58节:数值选择器NumberPicker 上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器Nu ...

  4. QT 线程池 + TCP 小试(三)实现最终功能

    *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 有了TCP.线程池,我们就可以把他们连接起来.使用最简单的 QMa ...

  5. 微软Skype实时口译增加中文

    直击现场 在机器翻译技术上,微软的 Skype 业务也算是行业内名列前茅.日前其实时口语翻译技术再次跃升一个台阶,新增了对中文(普通话)的翻译支持. 据美国科技新闻网站 TheVerge 报道,此前, ...

  6. Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用

    一.Android平台编程方式:      1.基于Android SDK进行开发的第三方应用都必须使用Java语言(Android的SDK基于Java实现)      2.自从ndk r5发布以后, ...

  7. 验证码生成器(在TImage.Canvas上写字,很好看)

    生成验证码的方式有很多种,如下则是比较简单的实现,且运用了正余弦曲线来扭曲验证码字符. unit AuthenticodeGenerate; interface uses SysUtils, Wind ...

  8. 云计算核心技术Docker的探索

    首先通过一个简单的场景来看一下为什么Docker这么火? 开发人员在开发的时候是有一套开发环境,包括运行的操作系统,依赖的服务比如WebLogic.Java,一些特定的配置,比如JVM大小.字符集,操 ...

  9. 阿里云CDN+OSS完成图片加速

    我们使用React Native开发APP,在列表中显示图片时,列表框经常出现长时间的空白.经过稍微研究和参考其他人的经验,我们知道React Native的ListView以及后来改进版的FlatL ...

  10. 解析《Effective Java》之多个构造器、Javabeans模式和Builder模式

    最近看<Effective Java>这本被很多同行称为神作的书,但是这本书很多地方缺少了举例不好懂,下面是关于我对书上知识的理解. 一.<Effective Java>中文版 ...