JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】
为什么80%的码农都做不了架构师?>>>
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议.
面向连接:服务器创建一个连接端口,客户端去连接服务器实现通信。
可靠的:tcp协议是是在连接成功之后才会发送数据,而基于UDP的协议是事先不会征求对方意见,直接将数据传送出去,因此TCP协议传输中,数据更可靠,更安全。
基于字节流:tcp协议中传递的信息是以流的形式传递的,在java中可通过inputstream来捕获,通过outputstream发送。
对于接收数据的时候出现假死的状态:
readLine()函数读取一行,结尾需要"\n"才能结束,不然会一直卡死在这里,因此大家在用printwriter的时候要print一个"\n",然后把printwriter flush掉。就不会假死了!
这样:pw.write("fuck you cient"); //send to server
pw.write("\n");
pw.flush();
在java中,tcp协议是已经封装好的类,可直接供用户使用。其中关键的两个类是
Socket类 ServerSocket类。
ServerSocket类用来创建服务器,具体用法请参照jdk文档。常用用法是
ServerSocket ss = new ServerSocket((int)port) //传入一个端口号,用户自定
Socket用于控制两端的连接,服务器的Socket可以和客户端的Socket相连接:
socket可以使用inputstream和outputstream进行相互通信。
(服务器中通常是将已将建立连接的socket丢给子线程通信,但是点对点可以让服务器处理一个socket就行了,不需要再生成子线程进行通信交流)
代码分为三个文件。
程序运行结果:
以下是代码附上:
//package org.cat.Client;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public class MyClient {public static void main(String[] args){try {Socket s = new Socket("localhost", 12341);System.out.println("conneting to server successfully");//successfully connecting to server//Now sending some data to server//1.create outputStream and so on...OutputStream out = s.getOutputStream();PrintWriter pw = new PrintWriter(out);pw.write("fuck you server"); //send to serverpw.write("\n"); //importantpw.flush();System.out.println("I have sended to server");//2.receiving data from serverInputStream in = s.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bfdReader = new BufferedReader(inReader);String tmp = "xxxx,receiving failed";while((tmp = bfdReader.readLine()) != null)System.out.println("server tells:"+tmp);//close allin.close();inReader.close();bfdReader.close();out.close();pw.close();} catch (IOException e) {System.out.println("connecting failed,have u opened server?");e.printStackTrace();}}
}
//package org.cat.Server;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class MyServer {public static void main(String[] args){try {@SuppressWarnings("resource")ServerSocket sers = new ServerSocket(12341);//then wait for client to connectSocket s;System.out.println("waiting for client to connect");s = sers.accept();new MyThread(s);} catch (IOException e) {System.out.println("set up server failed??");e.printStackTrace();}}}
//package org.cat.Server;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public //service for every client
class MyThread extends Thread{Socket s;public MyThread(Socket s) {this.s = s;start();//telling that connection has been settle up System.out.println("successed to connet with port of"+s.getLocalPort());//now receiving data and talk back to client//1.receivetry {InputStream in = s.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bfdReader = new BufferedReader(inReader);String tmp = "xxxx,receiving failed";if((tmp = bfdReader.readLine()) != null)System.out.println("client tells:"+tmp);//anwser clientOutputStream out = s.getOutputStream();PrintWriter pw = new PrintWriter(out);pw.write("fuck you cient"); //send to serverpw.write("\n");pw.flush();System.out.println("I have sended to client");//close allout.close();pw.close();in.close();inReader.close();bfdReader.close();} catch (IOException e1) {System.out.println("get inputStream from client failed");e1.printStackTrace();}System.out.println("now to shut connection");try {s.close();System.out.println("shut down connection successfully");} catch (IOException e) {System.out.println("shut server failed,have u opened it?");e.printStackTrace();}}}
转载于:https://my.oschina.net/qkmc/blog/861499
JAVA TCP通信基础篇——对发消息【如何解决输入流假死状态】相关推荐
- java 模拟飞秋客户端发消息
package feiQ; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSo ...
- JAVA编写企业微信定时发消息
可以使用 Java 语言编写定时发送企业微信消息的程序.首先需要获取企业微信开发者文档中提供的接口和 API,然后使用 Java 库如 HttpClient 等发送 HTTP 请求来调用这些 API. ...
- udp,tcp软件udp客户端发消息,udp服务器收不到,C#网络编程,多级路由间,UDP发送消息客户端接收不正常?...
udp协议是不需要进行握手连接的,所以你可能需要循环读取试试: //侦听消息 UdpClient receivingUdpClient = new UdpClient(侦听端口); IPEndPoin ...
- java给腾讯通发消息_通过web 向rtx发送通知消息
请通过调用RTX服务器CGI的方式实现,详细说明如下: 发送消息提醒 方法:GET/POST URL:/sendnotify.cgi 用法举例(IE地址栏中输入): http://192.168.17 ...
- java服务器如何群发消息,java TCP编程简单实现一个消息群发功能
client: package com.lzs.net; import java.io.*; import java.net.Socket; /** * Created by zaish on 201 ...
- java tcp发消息给硬件_java – TCP客户端/服务器通信只发送第一条消息?
我在java中设置一个简单的TCP客户端服务器交互. 服务器: 服务器是用Java编写的桌面客户端: import java.io.BufferedReader; import java.io.Dat ...
- java 给微信发消息_(新版)通过java程序,给微信发送消息
之前写过一篇使用飞鸽快信给自己的微信发送消息的示例.https://blog.csdn.net/xcxzzx01/article/details/80461086 两年多过去了,飞鸽快信已改名捷易快信 ...
- 服务器怎么把信息发送给用户,java中怎么用tcp/ip将服务器的消息发送给多个用户...
java中怎么用tcp/ip将服务器的消息发送给多个用户 关注:253 答案:2 mip版 解决时间 2021-01-31 01:26 提问者╬═掵中注定 2021-01-30 20:03 jav ...
- java 仿qq 传文件_java网络编程实现QQ发消息文件,图片等内容
前言:昨天我们已经初步学习了网络编程到底是怎么一回事儿,今天在此基础上继续学习网络编程,利用网络编程实现 QQ上的发送消息,群聊,私聊等功能. 首先我们来回顾一下昨天的两点基础知识: 1.建立服务器端 ...
最新文章
- VirtualBox在桥接模式下无网络处理
- 论前端工程师如何应对西电教学评估系统
- 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
- 比较好用的python编译器_10个最好用的在线编译工具
- FFmpeg音频编解码处理
- CCF NOI1054 扫雷游戏
- 预训练模型真的越大越好吗?听听他们怎么说
- linux 车载视频监控,基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文.docx...
- png-CRC32校验
- 云平台中节点异常如何考虑迁移因素
- Modernizr 浏览器兼容功能检测
- 用C#语言实现记事本
- 舞台音效控制软件_QLab Pro 4.3.2 优秀的舞台音乐控制软件
- 数据库基础知识(面试)
- 斯坦福大学公开课第四课 Views 视图
- ALSA子系统(十三)------snd_pcm_hw_refine硬件参数重定义
- Android 白天黑夜模式切换
- 前端生产环境调试工具sourcemap的使用
- 一行代码去除序列中含有n或者其他简并碱基的低质量序列
- 爬虫增加代理池:使用稳定第三方芝麻代理IP 教程(详细可用)