Socket简单Demo
Socket协议网上介绍的有很多了,就不在画蛇添足了,本文主要编写一个小Demo,介绍下它具体实现
一:Socket服务器端
- package com.founderit;
- import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;- public class HelloServer {
- public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
try {
ServerSocket serverSocket= new ServerSocket(1234);
while (true){
Socket socket= serverSocket.accept();
in=socket.getInputStream();
InputStreamReader reader= new InputStreamReader(in);
StringBuilder builder=new StringBuilder();
for (int c = reader.read(); c != -1; c = reader.read()) {
builder.append((char)c);
}
System.out.println("收到的客户端请求为:-------"+builder.toString());
out=socket.getOutputStream();
out.write("请求已接收,over".getBytes());
out.flush();
socket.shutdownOutput();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}- 二:Socket客户端
- package com.founderit.controller;
- import java.io.*;
import java.net.Socket;- public class SocketClient {
public static void main(String[] args) {
OutputStream out=null;
InputStream in=null;
Socket socket=null;
try {
socket=new Socket("localhost",1234);
out=socket.getOutputStream();
out.write("呼叫服务器,收到请回答".getBytes());
socket.shutdownOutput();
//获取输入流,并读取服务器端的响应信息
in=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
StringBuilder sb=new StringBuilder();
String info=null;
while ((info=br.readLine())!=null){
sb.append(info);
}
System.out.println("收到服务端回复:"+sb.toString());
br.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
out.flush();
out.close();
in.close();
socket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}- }
- 首先执行Socket服务端,它会一直运行等待接收请求,创建socketServer需要绑定端口,这个端口需需要与客户端一致
然后执行Socket客户端,它会发送Socket请求给服务端并接收服务器端反馈,运行效果如下
需要注意的是无论是客户端与服务端,执行write()方法后最好执行socket.shutdownOutput()方法关闭输出流,不然有几率写入不成功(原因未知)
----------------------------------------------------------------------------------------------------------------------我是分割线---------------------------------------------------------------------------------------------------------------------------------------------上面的Demo只是个单机版,在实际工作中不会只有一个客户端请求,下面我们将改造Socket服务器端,使其支持多线程
Socket服务器端
首先抽调具体实现,新建个具体实现类
- package com.founderit;
- import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Date;- public class HelloRunable implements Runnable{
Socket socket;
InputStream in = null;
OutputStream out = null;
public HelloRunable(Socket clientSocket){
this.socket=clientSocket;
}
@Override
public void run() {
try {
in=socket.getInputStream();
InputStreamReader reader= new InputStreamReader(in);
StringBuilder builder=new StringBuilder();
for (int c = reader.read(); c != -1; c = reader.read()) {
builder.append((char)c);
}
System.out.println("收到的客户端请求为:-------"+ new Date().toString()+ builder.toString());
out=socket.getOutputStream();
out.write("请求已接收,over".getBytes());
out.flush();
socket.shutdownOutput();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
in.close();
out.flush();
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
- 接收类
- package com.founderit;
- import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;- public class HelloServer {
- public static void main(String[] args) {
- try {
ServerSocket serverSocket= new ServerSocket(1234);
while (true){
Socket socket=serverSocket.accept();
new Thread(new HelloRunable(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
改造后,Socket服务端接收到请求后,会直接开启一个新线程执行任务
Socket简单Demo的更多相关文章
- windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo
设置方法 int nNetTimeout=10000;//10秒, //设置发送超时 setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char *) ...
- .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
- 设计模式之单例模式的简单demo
/* * 设计模式之单例模式的简单demo */ class Single { /* * 创建一个本类对象. * 和get/set方法思想一样,类不能直接调用对象 * 所以用private限制权限 * ...
- Spring的简单demo
---------------------------------------- 开发一个Spring的简单Demo,具体的步骤如下: 1.构造一个maven项目 2.在maven项目的pom.xml ...
- 使用Spring缓存的简单Demo
使用Spring缓存的简单Demo 1. 首先创建Maven工程,在Pom中配置 <dependency> <groupId>org.springframework</g ...
- Managed DirectX中的DirectShow应用(简单Demo及源码)
阅读目录 介绍 准备工作 环境搭建 简单Demo 显示效果 其他 Demo下载 介绍 DirectX是Microsoft开发的基于Windows平台的一组API,它是为高速的实时动画渲染.交互式音乐和 ...
- angular实现了一个简单demo,angular-weibo-favorites
前面必须说一段 帮客户做了一个过渡期的项目,唯一的要求就是速度,我只是会点儿基础的php,于是就用tp帮客户做了这个项目.最近和客户架构沟通,后期想把项目重新做一下,就用现在最流行的技术,暂时想的使用 ...
- 12、android socket使用demo:网络聊天
目录: 一.效果图 二.原代码分享 三.代码分析 四.总结 一.效果图如下: 客户端1: 客户端2: 二.原代码分享如下: 1.java代码只有一个 MainActivity.ja ...
- Solr配置与简单Demo[转]
Solr配置与简单Demo 简介: solr是基于Lucene Java搜索库的企业级全文搜索引擎,目前是apache的一个项目.它的官方网址在http://lucene.apache.org/sol ...
随机推荐
- Building a Service Mesh with HAProxy and Consul
转自:https://www.haproxy.com/blog/building-a-service-mesh-with-haproxy-and-consul/ HashiCorp added a s ...
- C语言第一篇博客
你对网络专业或者计算机专业了解是怎样? 进行网络安全,防止信息泄露. 你了解C语言么?C语言主要应用有哪些? C语言简言之就是一门计算机的编程语言. C语言主要应用于应用软件,服务器端开发,系统软件和 ...
- coci2011 debt 还债
coci2011 debt 还债 Description 有N个人,每个人恰好欠另一个人Bi元钱,现在大家都没有钱,政府想要给其中一些人欠,使得大家都不欠别人钱. 如A欠B 50,B欠C 20,则当政 ...
- Comparison of SIFT Encoded and Deep Learning Features for the Classification and Detection of Esca Disease in Bordeaux Vineyards(分类MobileNet,目标检测 RetinaNet)
识别葡萄的一种虫害,比较了传统SIFT和深度学习分类,最后还做了目标检测 分类用的 MobileNet,目标检测 RetinaNet MobileNet 是将传统深度可分离卷积分成了两步,深度卷积和逐 ...
- 第06组 Beta冲刺(5/5)
队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 继续维护后端代码 准备beta版本的答辩 GitHub签入记录 接下来的计划 整理任务, ...
- qtcreator 添加 cppreference 离线文档
https://en.cppreference.com/w/File:qch_book_20190607.zip 下载后放到 D:\Qt\Qt5.10.0\Docs\Qt-5.10.0目录下, 并在q ...
- 布局优化: <include />、<merge /> 、<ViewStub /> 标签的使用
在布局优化中,Androi的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一 ...
- postgresql - relation 权限相关问题
GRANT ALL PRIVILEGES ON DATABASE 数据库.[schema] TO [用户名]; GRANT ALL ON schema [schema] TO [用户名]; GRANT ...
- C# Newtonsoft.Json解析json字符串处理 - JToken 用法
//*调用服务器API(获取可以处理的文件) //1.使用JSON通信协议(调用[待化验任务API]) String retData = null; { JToken json = JToken.Pa ...
- matlab学习笔记11_1低维数组操作
一起来学matlab-matlab学习笔记11 11_1 低维数组操作repmat函数,cat函数,diag函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab ...