Java Socket编程示例
一、Socket简介:
1、什么是Socket
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
二、Socket通信实例①:
功能:客户端发送一条请求,服务器端接收,打印,向客户端返回一条信息,客户端接收,打印。
1、服务器端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; /**
* 该服务器端接收客户端发送的数据,并向客户端发送一条响应信息
* @author Administrator
*
*/
public class MyServer { public static void main(String[] args) { ServerSocket server = null;
Socket client = null;
PrintWriter pw = null;
BufferedReader br = null;
try { server = new ServerSocket(6789);
//获取连接
client = server.accept();
pw = new PrintWriter(client.getOutputStream()); //接收客户端传递的数据
br = new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.print("Info From Client:");
//此处仅读一行,若采用while()的方式,如果读取不到结束标记,会阻塞
System.out.println(br.readLine());
System.out.println("server over..."); //向客户端写回数据
pw.print("Hello Client!! I am Server!!!\r\n");
pw.flush(); } catch (IOException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
if(br != null) {
br.close();
}
if(pw != null) {
pw.close();
}
if(client != null) {
client.close();
}
if(server != null) {
server.close();
}
} catch (IOException e) {
e.printStackTrace();
} }
} }
2、客户端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 该客户端类仅实现以下功能:
* 向服务器发送信息,接收从服务器返回的数据,仅读取一行
* @author Administrator
*
*/
public class MyClient { public static void main(String[] args) { Socket socket = null;
PrintWriter pw = null;
BufferedReader br = null;
try {
//指定服务器地址+端口
socket = new Socket("127.0.0.1", 6789);
pw = new PrintWriter(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 向服务器端发送数据
pw.write("Hello Server!!! I am Client!!!\r\n");
pw.flush(); // 接收服务器端返回的数据
System.out.print("Info From Server:");
//此处仅读一行,若采用while()的方式,如果没有结束标记,会阻塞
System.out.println(br.readLine());
System.out.println("client over..."); } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) {
br.close();
}
if (pw != null) {
pw.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} }
3、注意事项:
防止方式阻塞导致程序卡死。Socket阻塞或者是流读取的阻塞。
三、Socket通信多线程版本:
实际使用时肯定是服务端接收到一个请求就开启一个线程来处理对应的请求。
四、其他思路扩展:
1、java.nio包提供了支持非阻塞通信的类,主要包括:
•ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。
•SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信。
•Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读就绪和写就绪事件。
•SelectionKey:代表ServerSocketChannel以及SocketChannel向Selector注册事件的句柄。当一个SelectionKey对象位于Selector对象的selected-keys集合中,就表示与这个SelectionKey对象相关的事件发生了。
ServerSocketChannel以及SocketChannel都是SelectableChannel的子类,如图3所示。SelectableChannel类以及其子类都能委托Selector来监控它们可能发生的一些事件,这种委托过程也称为注册事件过程。
待续......
Java Socket编程示例的更多相关文章
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- 多线程Java Socket编程示例(转)
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...
- 如何为可扩展系统进行Java Socket编程
从简单I/O到异步非阻塞channel的Java Socket模型演变之旅 上世纪九十年代后期,我在一家在线视频游戏工资工作,在哪里我主要的工作就是编写Unix Unix Berkley Socket ...
- Java Socket编程题库
一. 填空题 ___ IP地址____用来标志网络中的一个通信实体的地址.通信实体可以是计算机,路由器等. 统一资源定位符URL是指向互联网"资源"的指针,由4部分组成:协议 ...
- Java Socket编程(转)
Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首 ...
- Java基础:三步学会Java Socket编程
Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛 第一步 ...
- 转:Java Socket编程
对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将 ...
- Java Socket编程基础篇
原文地址:Java Socket编程----通信是这样炼成的 Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Sock ...
- Java Socket编程详细解说
Java Socket编程 JavaSocketServerSocket乱码超时 Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是So ...
随机推荐
- div里包含img底部必定多出空白的解决办法
研究了很久,自己写了js代码都解决不了.最后还是靠万能的网友解决了这一问题! 问题:adding.margin.border都设为0,无效.怎么样都多出3px. 解决方案: 1.设置div{ font ...
- js之DOM和事件
DOM 查找 直接查找 var obj = document.getElementById('i1') 间接查找 文件内容操作: innerText 仅文本 innerHTML 全内容 value i ...
- 【云计算】docker相关开源项目、工具
十大基于Docker的开发工具 作者 郭蕾 发布于 2014年8月19日 | 注意:QCon全球软件开发 ...
- CSS3 text-overflow 属性
1. <!DOCTYPE html> <html> <head> <style> div.test { white-space:nowrap; widt ...
- 【leetcode】Minimum Path Sum
Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...
- C#值数值类型转换
1.十进制转16进制 string result=number.ToString("X2"); >>0A //X2表示大写2位 2.字符串转数值类型 "); ...
- python to be linux daemon
所需第三方库:python-daemon[https://pypi.python.org/pypi/python-daemon/] 使用方式: python linux_service.py star ...
- jQuery DataTables && Django serializer
jQuery DataTables https://www.datatables.net 本文参考的官方示例 http://datatables.net/release-datatables/exam ...
- 原:[eclipse启动错误] JVM terminated.Exit code=2
启动eclipse的时候忽然出现以下错误: 解决方案: 删除环境变量PATH或者Path中的 C:\ProgramData\Oracle\Java\javapath
- codeforces 582A. GCD Table 解题报告
题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com ...