Java--Socket通信(双向)
新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端
两个工程的读写操作线程类基本上完全相同
服务端:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket; public class Server { public static final int PORT = 8000;//监听的端口号 public static void main(String[] args) {
Server server = new Server();
server.init();
} public void init() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(PORT);
while (true) {
Socket client = serverSocket.accept();
//一个客户端连接就开户两个线程处理读写
new Thread(new ReadHandlerThread(client)).start();
new Thread(new WriteHandlerThread(client)).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if(serverSocket != null){
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /*
*处理读操作的线程
*/
class ReadHandlerThread implements Runnable{
private Socket client; public ReadHandlerThread(Socket client) {
this.client = client;
} @Override
public void run() {
DataInputStream dis = null;
try{
while(true){
//读取客户端数据
dis = new DataInputStream(client.getInputStream());
String reciver = dis.readUTF();
System.out.println("客户端发过来的内容:" + reciver);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(dis != null){
dis.close();
}
if(client != null){
client = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /*
* 处理写操作的线程
*/
class WriteHandlerThread implements Runnable{
private Socket client; public WriteHandlerThread(Socket client) {
this.client = client;
} @Override
public void run() {
DataOutputStream dos = null;
BufferedReader br = null;
try{
while(true){
//向客户端回复信息
dos = new DataOutputStream(client.getOutputStream());
System.out.print("请输入:\t");
// 键盘录入
br = new BufferedReader(new InputStreamReader(System.in));
String send = br.readLine();
//发送数据
dos.writeUTF(send);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if(dos != null){
dos.close();
}
if(br != null){
br.close();
}
if(client != null){
client = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket; public class Client { public static final String IP = "localhost";//服务器地址
public static final int PORT = 8000;//服务器端口号 public static void main(String[] args) {
handler();
} private static void handler(){
try {
//实例化一个Socket,并指定服务器地址和端口
Socket client = new Socket(IP, PORT);
//开启两个线程,一个负责读,一个负责写
new Thread(new ReadHandlerThread(client)).start();
new Thread(new WriteHandlerThread(client)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
} /*
*处理读操作的线程
*/
class ReadHandlerThread implements Runnable{
private Socket client; public ReadHandlerThread(Socket client) {
this.client = client;
} @Override
public void run() {
DataInputStream dis = null;
try {
while(true){
//读取服务器端数据
dis = new DataInputStream(client.getInputStream());
String receive = dis.readUTF();
System.out.println("服务器端返回过来的是: " + receive);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
if(dis != null){
dis.close();
}
if(client != null){
client = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /*
* 处理写操作的线程
*/
class WriteHandlerThread implements Runnable{
private Socket client; public WriteHandlerThread(Socket client) {
this.client = client;
} @Override
public void run() {
DataOutputStream dos = null;
BufferedReader br = null;
try {
while(true){
//取得输出流
dos = new DataOutputStream(client.getOutputStream());
System.out.print("请输入: \t");
//键盘录入
br = new BufferedReader(new InputStreamReader(System.in));
String send = br.readLine();
//发送数据
dos.writeUTF(send);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try{
if(dos != null){
dos.close();
}
if(br != null){
br.close();
}
if(client != null){
client = null;
}
}catch(Exception e){
e.printStackTrace();
}
}
}
}
Java--Socket通信(双向)的更多相关文章
- java socket通信-传输文件图片--传输图片
ClientTcpSend.java client发送类 package com.yjf.test; import java.io.DataOutputStream; import java.io ...
- java Socket通信使用BufferedReader和BufferedWriter的注意事项
注意事项:readLine()要求有换行标识,write()要输出换行标识,要调用flush()刷新缓冲区. 以下是取自java socket通信中的一小段代码. BufferedReader rea ...
- Java Socket通信读取相关信息代码
转自:http://developer.51cto.com/art/201003/190206.htm Java Socket通信读取有不少需要我们注意的知识点.当我们在使用的时候有很多的问题摆在我们 ...
- Java socket通信
首先抛开语言层面,简单介绍一下socket通信过程: 1.服务器端开启监听端口,阻塞进程 等待客户端连接 2.客户端连接,这时就产生了一个socket socket就相当于一个传递消息的通道,一般都 ...
- Java Socket通信以及可能出现的问题解决
Java中基于TCP协议实现网络通信的两个类:客户端的Socket和服务器端的ServerSocket. Socket通信模型如图所示: 不管Socket通信的功能有多复杂,任何socket通信过程的 ...
- Java Socket通信实现私聊、群聊
前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...
- Java Socket 通信实例 - 转载
基于Tcp协议的简单Socket通信实例(JAVA) 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...
- Java Socket通信实例
一.简单的客户端与服务器一对一连接: Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Scket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关 ...
- 【Java】Java Socket 通信演示样例
用socket(套接字)实现client与服务端的通信. 这里举两个样例: 第一种是每次client发送一个数据,服务端就做一个应答. (也就是要轮流发) 另外一种是client能够连续的向服务端发数 ...
- java Socket通信,客户端与服务端相互发消息
1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...
随机推荐
- Python数据分析流程
一.数据分析的步骤: 1.查看数据并提出问题 2.数据清洗 3.代码编写,提取出结果数据,并分析是否有异常数据,修改代码 4.根据数据选择合适的图表进行展示 5.根据图表小组讨论交流获得最终的结果 二 ...
- FPGA IN 金融领域
何为金融: 金融指货币的发行.流通和回笼,贷款的发放和收回,存款的存入和提取,汇兑的往来等经济活动.金融(FIN)就是对现有资源进行重新整合之后,实现价值和利润的等效流通. 金融主要包括银行.证券.基 ...
- MyBatis Generator配置示例
(一).MBG介绍 MyBatis Generator(MBG)是一个Mybatis的代码生成器,它可以用来生成可以访问(多个)表的基础对象.MBG解决了对数据库操作有最大影响的一些简单的CRUD(插 ...
- WebApi接口返回json,xml,text纯文本等
[Route("api/Message/MessageList/")] [HttpGet] public HttpResponseMessage MessageList() { R ...
- sublime addons backup
1.you can create a file to store you installed addons and use git to store github.com just like that ...
- 关于string.h中字符串的操作
string.h中字符操作的函数 注意:**对字符数组的多次操作需要进行赋初值.或者善于用memset()函数进行清空数组的操作.** 否则容易出现错误. string.h文件中函数的用法加 ...
- 多个code.csdn.net账号切换
code.csdn.net是国内开源库 使用git需要在项目添加密钥 而如果有多个账户,一个是私人,一个是公司,那么这时怎么做? 密钥存在~/.ssh默认是id_rsa 那么一个比较笨的办法是做一个k ...
- js的解析顺序 作用域 严格模式
一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a); 2 var a = 1; 如果执行顺序是从上到 ...
- MySQL中字段类型为timestamp的小坑
之前遇到过一个MySQL的字段为timestamp类型的小坑. MySQL中一个字段存储时间类型数据的时候,该字段的类型如果为timestamp类型的话,最多只能存储到2038-01-19 11:14 ...
- 基于Python实现matplotlib中动态更新图片(交互式绘图)
最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...