对学习过程中自己敲的一些关于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. Visual Studio更改编码格式为“UTF-8”

    原文:Visual Studio更改编码格式为"UTF-8" 用VS2015新建了个Python文件,在VS2015打开时中文显示正常, 用Visual Studio Code文本 ...

  2. WPF下Itemscontrol分组 样式

    原文 WPF下Itemscontrol分组 样式 <ItemsControl Grid.Row="1" DataContext="{Binding Layouts} ...

  3. python 编码转换 专题

    主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编 ...

  4. asp.net文件流下载的代码摘要

    try { var workbook = new XLWorkbook(); if (Workbook != null) { workbook = Workbook; } if (this.Expor ...

  5. 【转】微信退款时候报”请求被中止: 未能创建 SSL/TLS 安全通道“或”The request was aborted: Could not create SSL/TLS secure channel“的错误

    退款测试在我本机测试一切都是正常的,但是发布到了服务器就报这样的一个错啦 但是无论百度或者google或者bing,你能够搜索到的结果都很类似,综合起来就是加这样一些代码,如下 ServicePoin ...

  6. Java底层知识学习:Bytecode and JMM

    最近在跟着耗子哥的程序员练级指南学习Java底层知识,结合<深入理解Java虚拟机>这本书在看,写笔记,看资料,成长中…… 目前看完了第二章JMM和各内存区OOM的情况 一篇图文并茂介绍字 ...

  7. UWP-ListView到底部自动加载更多数据

    原文:UWP-ListView到底部自动加载更多数据 ListView绑定的数据当需要“更多”时自动加载 ListView划到底部后,绑定的ObservableCollection列表数据需要加载的更 ...

  8. UWP中String 转为Path Data

    定义方法: Geometry PathMarkupToGeometry(string pathMarkup) { string xaml = "<Path " + " ...

  9. 一顶博士帽能带来什么——访GOOGLE公司中国区总裁李开复

      在读了博士生远潇给本报的来信后,GOOGLE公司中国区总裁李开复说,有这些困惑和担心,实际上是很多博士生们在读博士之前并没有认真地想过,自己是不是能耐得住寂寞做学问,是不是能抵御来自物质世界的诱惑 ...

  10. CREATE CSS3是一款在线集成众多CSS3功能的生成器,可以在线生成常用的CSS3效果

    CREATE CSS3是一款在线集成众多CSS3功能的生成器,可以在线生成常用的CSS3效果 CREATE CSS3 彩蛋爆料直击现场 CREATE CSS3是一款在线集成众多CSS3功能的生成器,可 ...