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 ...
随机推荐
- JavaScript之函数
控制语句(switch) switch(name){ case '1': age = 123; break; case '2': age = 456; break; case '3': age = 7 ...
- Python自动化之socketserver模块
1 动态导入模块 import importlib aa = importlib.import_module("lib1.aa") //lib跟当前模块不是一个目录,aa是lib下 ...
- python日志浅析
输出日志对于追踪问题比较重要. 默认logger(root) python使用logging模块来处理日志.通常下面的用法就能满足常规需求: import logging logging.debug( ...
- Thread.Sleep vs. Task.Delay
We use both Thread.Sleep() and Task.Delay() to suspend the execution of a program for some given tim ...
- 数据库视图 (View)和EntityFramework Code First结合使用
问题来源: 项目需要进行查询操作,会涉及多表间的联合查询,使用Entity Framework会牵涉到效率问题,为增加查询速度,所以使用数据库视图技术,综合来讲是将Model类映射到数据库View. ...
- Myeclipse8.5 反编译插件 jad 安装
准备工作 下载jad.exe文件和下载jadeclipse插件:http://pan.baidu.com/s/1pJKjVwn JadClipse 官网:http://jadclipse.source ...
- locustio压力测试
2015年7月17日 22:19:17 星期五 这里记录下学习道路, 防止忘了 操作系统是centos: 首先是linux系统, 装有Python 和 Python-devel (否则安装软件会提示p ...
- C# Winform中如何获取文件名与文件路径
获取文件名方法: 用System.IO.Path.GetFileName和System.IO.Path.GetFileNameWithoutExtension(无扩展名)的方法 获取文件路径方法: / ...
- 6.SpringMVC注解启用
SpringMVC注解可以帮助我们快速地注入 属性和参数 提高开发效率. 由于 有相当一部分人讨厌xml配置方式 注解可以覆盖 xml则不能 使用注解比xml规范化,因为很多注解都是java的规范的范 ...
- java 入门 第二季4
1. 多态 继承是多态的实现基础 引用的多态 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 方法的多态 创建本类对象时,调用本类方法 2种是调用子类的方法或继承的方法 子类中添加独有的方 ...