Socket通常也称作"套接字"。用于描写叙述IP地址和port,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

ServerSocket用于server端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完毕所需的会话。

对于一个网络连接来说,套接字是平等的,并没有区别,不由于在server端或在client而产生不同级别。套接字之间的连接过程能够分为三个步骤:server监听,client请求,连接确认。

实例一:基于TCP/IP协议的Socket通信一对一:

package z_test_Socket_Demo;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TestServerSocket { public static void main(String[] args) {
// TODO 自己主动生成的方法存根
ServerSocket serverSocket = null;
Socket socket = null;
OutputStream outputStream = null;
try {
serverSocket = new ServerSocket(8888); // 指定监听端口
System.out.println("==>> accepting");
socket = serverSocket.accept(); // 监听client的请求,方法堵塞,请求成功,返回socket对象
outputStream = socket.getOutputStream(); // 获得输出流
String string = "==>> Hello client,This is a message from server"; // 随便给client发点东西
byte[] buffer = string.getBytes();
outputStream.write(buffer);
outputStream.flush();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} finally {
try {
serverSocket.close();
socket.close();
outputStream.close();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
}
}
}
package z_test_Socket_Demo;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException; public class TestClientSocket { public static void main(String[] args) {
// TODO 自己主动生成的方法存根
Socket socket = null;
InputStream inputStream = null;
try {
// socket = new Socket(InetAddress.getLocalHost(), 8888);
// 请求连接服务器的8888端口,构造方法通常能够指定IP地址
socket = new Socket("10.25.26.141", 8888);
inputStream = socket.getInputStream(); // 获得输入流
byte[] buffer = new byte[64];
int temp = 0;
while ((temp = inputStream.read(buffer)) != -1) { // 将数据读入字节数组,此方法堵塞
System.out.println(new String(buffer));
}
} catch (UnknownHostException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} finally {
try {
socket.close();
inputStream.close();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
}
}
}

先执行服务器端,打印结果:

==>> accepting

然后执行client,打印结果:

==>> Hello client,This is a message from server

实例二:基于TCP/IP协议的Socket通信一对多:

仅仅须要把服务器段用一个线程死循环就可以

package z_test_Socket_Demo;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TestServerSocket { public static void main(String[] args) {
// TODO 自己主动生成的方法存根
new Thread(new ServerThread()).start();
} private static class ServerThread implements Runnable { @Override
public void run() {
// TODO 自己主动生成的方法存根
int i = 1;
while (true) {
ServerSocket serverSocket = null;
Socket socket = null;
OutputStream outputStream = null;
try {
serverSocket = new ServerSocket(8888); // 指定监听端口
System.out.println("==>> accepting client" + i++);
socket = serverSocket.accept(); // 监听客户端的请求,方法堵塞,请求成功。返回socket对象
outputStream = socket.getOutputStream(); // 获得输出流
String string = "==>> Hello client" + i++
+ ",This is a message from server"; // 随便给客户端发点东西
byte[] buffer = string.getBytes();
outputStream.write(buffer);
outputStream.flush();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
} finally {
try {
serverSocket.close();
socket.close();
outputStream.close();
} catch (IOException e) {
// TODO 自己主动生成的 catch 块
e.printStackTrace();
}
}
}
}
}
}

执行服务器段,打印结果:

==>> accepting client1

执行client,client打印结果:

==>> Hello client1,This is a message from server

再次执行client,client打印结果:

==>> Hello client2,This is a message from server

相当于两个不同的client请求连接server

弄懂的了基于TCP/IP协议的Socket通信,基于其它协议的Socket通信应该能够非常快就能弄明确了。

Java:Socket通信的更多相关文章

  1. java socket通信-传输文件图片--传输图片

    ClientTcpSend.java   client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...

  2. java Socket通信使用BufferedReader和BufferedWriter的注意事项

    注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...

  3. Java Socket通信读取相关信息代码

    转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...

  4. Java socket通信

    首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程  等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...

  5. Java Socket通信以及可能出现的问题解决

    Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的 ...

  6. Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...

  7. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA)   好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...

  8. Java Socket通信实例

    一.简单的客户端与服务器一对一连接: Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Scket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关 ...

  9. 【Java】Java Socket 通信演示样例

    用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...

  10. java Socket通信,客户端与服务端相互发消息

    1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...

随机推荐

  1. Task.Run 和 Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  2. ssh项目导入报the import javax.servlet cannot be resolved

    在做javaWeb项目时,我们经常会出现丢失包的情况,如下图所示的错误,我们应该怎么解决呢? 根据网上教程向工程中加入tomcat的servlet-api.jar和jsp-api.jar的包 此时项目 ...

  3. android Activity实现底部滑动弹出窗口及源码下载地址

    在做微信.微博.qq等分享时,一般是点击分享按钮后会从底部弹出滑动窗口,然后选择要分享的社交平台进行分享.今日头条.腾讯新闻等内容App的评论也是从底部滑动弹出输入窗口,进行评论输入的.本篇文章就讲讲 ...

  4. IE bug集锦

    ie8 iframe 不显示 问题描述: IE8的非兼容模式下(兼容模式是ie7,不存在),iframe会不显示: 可以通过Ctrl+A全选或者是调整窗口大小显示出来. 解决办法: 这是由于要显示的i ...

  5. mysql幻读

    开启a,b两个数据库连接,a.b都开启事务后,b插入了一条数据R并提交,验证对a的操作造成的影响 select select for update update R update R 后 select ...

  6. jquery jstree 插件的使用

    最近一个项目 需要用到jstree 这个jQuery插件,就研究了下,做目录树 菜单还是很强大的,下面对经常会用到几个用法做下说明. 1. 首先页面 引用 jquery.jstree 2. html ...

  7. linux mysql-workbench 创建与正式库表结构一样的表

    先在本地创建数据库 字符集选择这个 创建数据库成功 创建与正式库一样的表 step1: 连接正式库,找到要生成的表,导出创建表的sql语句 step2: 找到本地数据库,选择表,在sql执行区域复制s ...

  8. react特性-声明式编程

    网络上有很多关于声明式编程和命令式编程的对比和说明,但是大多都是大同小异,总的来说就是一句话"告诉电脑我要做什么,但是让电脑自己决定怎么做." 1.命令式编程. 这种编程模式比较常 ...

  9. vue上传阿里云图片组件

    首先需要弄一个阿里云存储.然后配置一下.前端就可以直接上传图片并回显.可在父级组件定义上传图片类型以及大小.默认为500kb.样式可以自适应调整. <template> <div c ...

  10. c3p0 连接池配置

    C3P0 可使用properties 配置文件方式,将c3p0.properties放在classpath目录下,如果为WEB应用,放在WEB-INF\classes下 c3p0.properties ...