Java - TCP网络编程
Java - TCP网络编程
Server
逻辑思路:
- 创建ServerSocket(port),然后服务器的socket就启动了
- 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回用户的socket
- 利用多线程对用户socket进行IO操作
注意:对Scoket/File进行创建、关闭,都需要放try catch中,检测 IOException,所以将网络IO部分整体放入try catch中即可。
1. 字符串操作
输出:PrintWriter out=new PrintWriter(sock.getOutputStream(), true);
读取:BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
或者:Scanner input=new Scanner(sock.getInputStream());
2. 字节操作(一般用于传输文件,体积大,要求效率高,用BufferedInputStream/BufferedOutputStream)
输出:BufferedOutputStream out=new BufferedOutputStream(sock.getOutputStream());
输出:BufferedInputStream out=new BufferedInputStream(sock.getInputStream());
import java.io.*;
import java.net.*; public class TCP_Server { public static void main(String[] args){ int port=8888; try {
ServerSocket sock=new ServerSocket(port);
System.out.println("服务器启动,Port:"+sock.getLocalPort());
while(true){
Socket client=sock.accept(); //***注意,accept()是个阻塞函数,返回client socket***
System.out.println("监测到TCP连接来自:"+client.getRemoteSocketAddress());
new WorkThread(client).start(); //多线程
}
}
catch (IOException e) {
System.out.println("ERROR Found: "+e.getMessage());
}
//end try catch }
} class WorkThread extends Thread{ Socket sock;
public WorkThread(Socket sock){
this.sock=sock;
} public void run(){
try{
//此处用BufferedReader实现
BufferedReader in=new BufferedReader(new InputStreamReader(sock.getInputStream()));
PrintWriter out=new PrintWriter(sock.getOutputStream(),true); String s=null;
while((s=in.readLine())!=null){ //断开会返回null
if(s.equals("end"))
break;
System.out.println("收到:"+s);
out.println("Server:"+s);
} /*注意,readLine()是个阻塞函数,放在while((s=readLine())!=null)中会堵塞程序,等待用户的数据。
*有两种方式中断循环
*1.用户端断开TCP程序,in.readLine()会返回null
*2.用户正常退出,用户端发送个[结束标记]给服务器,服务器根据标记,中断循环
*/
System.out.println("监测到TCP连接来自:"+sock.getRemoteSocketAddress()+"已断开。"); in.close();
out.close();
sock.close();
}
catch(IOException e){
System.out.println(e.getMessage());
}
} }
Client
逻辑思路:
- 创建Socket(IP, port),其参数为目标服务器的IP和port
- 然后就可以通过Socket进行IO操作了
import java.net.*;
import java.io.*;
import java.util.*; public class TCP_Client { public static void main(String[] args) { Scanner in=new Scanner(System.in); try{ int port=8888;
String ip="127.0.0.1"; Socket sock=new Socket(ip, port); //从socket中输出
PrintWriter out=new PrintWriter(sock.getOutputStream(),true);
//从socket中读取,此处用Scanner实现
Scanner input=new Scanner(sock.getInputStream()); while(true){
System.out.print("请输入消息:");
String s=in.nextLine();
if(s.equals("end")){
out.println(s);
break;
} out.println(s);
System.out.println("发送:"+s);
s=input.nextLine();
System.out.println("收到:"+s);
} in.close();
input.close();
out.close();
sock.close();
}
catch (IOException e){
System.out.println("ERROR Found: "+e.getMessage());
} } }
Java - TCP网络编程的更多相关文章
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 二十三、Java基础--------网络编程
Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...
- JAVA的网络编程
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- Java Socket 网络编程心跳设计概念
Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...
- 【转】JAVA之网络编程
转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...
- JAVA的网络编程【转】
JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...
- Java面向对象 网络编程 下
Java面向对象 网络编程 下 知识概要: (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端: ...
- Java面向对象 网络编程 上
Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...
- TCP网络编程
TCP网络编程 与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的.客服端:public class TCPClient { /** * @param args * @th ...
随机推荐
- Django - 模版之继承
模版继承: 当多个html有共同之处时,需要建立一个模版html(master.html) 1.在模版html中,写入公共的部分: 备注:在模版中,我们可以指定多个block ,其中,可以在标题,cs ...
- mongodb--命令练习
windows10安装下载mongodb # 官网或镜像地址下载mongodb exe 二进制安装包 # 安装时选用custorm 去除勾选compass可视化工具 # 安装完成创建data文件,修改 ...
- 2018NOIP普及T4---对称二叉树
题目 对称二叉树 题目描述 思路 检查是否符合对称条件 条件很简单——结构对称&&点权对称 要做到点权对称其实也就顺便结构对称了 于是条件可以简化为点权对称 可以考虑并行搜索 bo ...
- 类模板成员函数默认值问题:an out-of-line definition of a member of a class template cannot have default arguments
template <typename T> class A { ); }; template<typename T> ) { /* */ } 对于类似上文代码,VS编译器会报 ...
- 洛谷 P1280 尼克的任务 (线性DP)
题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...
- 在Java中调用带参数的存储过程
JDBC调用存储过程: CallableStatement 在Java里面调用存储过程,写法那是相当的固定: Class.forName(.... Connection conn = DriverMa ...
- [bzoj3191][JLOI2013][卡牌游戏] (概率dp)
Description N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字 ...
- Spring核心技术(二)——Spring的依赖及其注入
本文将继续前文,描述Spring IoC中的依赖处理. 依赖 一般情况下企业应用不会只有一个对象(或者是Spring Bean).甚至最简单的应用都要多个对象来协同工作来让终端用户看到一个完整的应用的 ...
- 阿里云服务器Ubuntu 16.04 3安装mysql
.更新系统 apt-get update [注意:要在root用户下] .安装mysql-server apt-get install mysql-serverapt-get install mysq ...
- [luoguP1516] 青蛙的约会(扩展欧几里得)
传送门 对于数论只会gcd的我,也要下定决心补数论了 列出方程 (x + t * m) % l = (y + t * n) % l 那么假设 这两个式子之间相差 num 个 l,即为 x + t * ...