TCP网络编程
TCP网络编程
与UDP不同的是TCP是通过客服端和服务端的方式来传输数据的。
客服端:
public class TCPClient {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException, IOException {
/*
* 需求:创建一个客户端,给服务器端发送一个字符串数据。
* 思路:
* 1,先有socket服务,为了创建连接。
* 2,一旦连接建立说明有了数据传输的通道,这就是基于socket的io流。
* 既然是发送一个数据到服务端,可以使用socket io流中的输出流。
* 3,关闭资源。
*/
System.out.println("客户端开启........");
//1,创建客户端socket服务,通过Socket对象完成。在一创建就明确对方地址和端口。
Socket s = new Socket("192.168.1.252",10002);
//2,一旦连接建立,就有了socket流。既然是发送,需要使用socket的输出流。
OutputStream out = s.getOutputStream();
//3,通过输出流对象的write方法,将数据发送目标主机。
out.write("tcp演示,哥们又来了!".getBytes());
//4,关闭资源。
s.close();
System.out.println("客户端关闭........");
}
}
服务器端:
public class TCPServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/*
* 需求:接收客户端的数据,打印到显示器上。
* 服务端创建的思路:
* 思路:
* 1,必须有socket服务。
* 2,接收客户端的数据。
* 3,打印到显示器上,并关闭资源。
*
*/
System.out.println("服务端开启。。。。。。");
//1,创建服务端的socket对象。使用ServerSocket。并明确一个监听的端口。这是必须的。
ServerSocket ss = new ServerSocket(10002);
//2,接收客户端的数据,怎么接收呢?首先获取到客户端对象,然后在通过客户端对象的socket流中的读取流读取数据。
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"......connected");
//3,通过客户端对象获取读取流。
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String str = new String(buf,0,len);
System.out.println(str);
//4,关闭资源。
s.close();
ss.close();
System.out.println("服务端关闭。。。。。。");
}
}
基于TCP协议的网络编程
TCP协议是一种可靠的通络协议,通信两端的Socket使得它们之间形成网络虚拟链路,两端的程序可以通过虚拟链路进行通讯。Java使用socket对象代表两端的通信端口,并通过socket产生的IO流来进行网络通信。
2.1 ServerSocket
在两个通信端没有建立虚拟链路之前,必须有一个通信实体首先主动监听来自另一端的请求。ServerSocket对象使用accept()方法用于监听来自客户端的Socket连接,如果收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket对象。如果没有连接,它将一直处于等待状态。通常情况下,服务器不应只接受一个客户端请求,而应该通过循环调用accept()不断接受来自客户端的所有请求。
这里需要注意的是,对于多次接收客户端数据的情况来说,一方面可以每次都在客户端建立一个新的Socket对象然后通过输入输出通讯,这样对于服务器端来说,每次循环所接收的内容也不一样,被认为是不同的客户端。另外,也可以只建立一次,然后在这个虚拟链路上通信,这样在服务器端一次循环的内容就是通信的全过程。
服务器端的示例代码:
Java代码
- //创建一个ServerSocket,用于监听客户端Socket的连接请求 监听端口为30000
- ServerSocket ss = new ServerSocket(30000);
- //采用循环不断接受来自客户端的请求
- while (true)
- {
- //每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
- Socket s = ss.accept();
- //将Socket对应的输出流包装成PrintStream
- PrintStream ps = new PrintStream(s.getOutputStream());
- //进行普通IO操作
- ps.println("您好,今天服务器的大姨夫来了!");
- //关闭输出流,关闭Socket
- ps.close();
- s.close();
- }
2.2 Socket
使用Socket可以主动连接到服务器端,使用服务器的IP地址和端口号初始化之后,服务器端的accept便可以解除阻塞继续向下执行,这样就建立了一对互相连接的Socket。
客户端示例代码:
Java代码
- Socket socket = new Socket("127.0.0.1" , 30000);
- //将Socket对应的输入流包装成BufferedReader
- BufferedReader br = new BufferedReader(
- new InputStreamReader(socket.getInputStream()));
- //进行普通IO操作
- String line = br.readLine();
- System.out.println("来自服务器的数据:" + line);
- //关闭输入流、socket
- br.close();
- socket.close();
2.3 使用多线程
在复杂的通讯中,使用多线程非常必要。对于服务器来说,它需要接收来自多个客户端的连接请求,处理多个客户端通讯需要并发执行,那么就需要对每一个传过来的Socket在不同的线程中进行处理,每条线程需要负责与一个客户端进行通信。以防止其中一个客户端的处理阻塞会影响到其他的线程。对于客户端来说,一方面要读取来自服务器端的数据,另一方面又要向服务器端输出数据,它们同样也需要在不同的线程中分别处理。
具体代码如下,服务器端:
Java代码
- public class MyServer
- {
- //定义保存所有Socket的ArrayList
- public static ArrayList<Socket> socketList = new ArrayList<Socket>();
- public static void main(String[] args)
- throws IOException
- {
- ServerSocket ss = new ServerSocket(30000);
- while(true)
- {
- //此行代码会阻塞,将一直等待别人的连接
- Socket s = ss.accept();
- socketList.add(s);
- //每当客户端连接后启动一条ServerThread线程为该客户端服务
- new Thread(new ServerThread(s)).start();
- }
- }
- }
客户端:
Java代码
- public class MyClient
- {
- public static void main(String[] args)
- throws IOException
- {
- Socket s = s = new Socket("127.0.0.1" , 30000);
- //客户端启动ClientThread线程不断读取来自服务器的数据
- new Thread(new ClientThread(s)).start();
- //获取该Socket对应的输出流
- PrintStream ps = new PrintStream(s.getOutputStream());
- String line = null;
- //不断读取键盘输入
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- while ((line = br.readLine()) != null)
- {
- //将用户的键盘输入内容写入Socket对应的输出流
- ps.println(line);
- }
- } }
TCP网络编程的更多相关文章
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 简述TCP网络编程本质
基于事件的非阻塞网络编程是编写高性能并发网络服务程序的主流模式,头一次使用这种模式编程需要转换思维模式 .把原来的"主动调用recv()来接收数据,主动调用accept()来接受连接,主动调 ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- Java - TCP网络编程
Java - TCP网络编程 Server 逻辑思路: 创建ServerSocket(port),然后服务器的socket就启动了 循环中调用accept(),此方法会堵塞程序,直到发现用户请求,返回 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- TCP网络编程小结
一.套接字编程基础 1.套接字地址结构 通用的地址结构是 struct sockaddr{ unsigned short sa_family; ]; } IPv4的套接字地址结构是 struct in ...
- tcp 网络编程
网络编程同时也是进程间的一种通信:服务器进程和应用进程间的通信. OSI:开放式系统互联 OSI 7层模型: ...
- 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
随机推荐
- 一本通1536数星星 Stars
1536:[例 2]数星星 Stars 时间限制: 256 ms 内存限制: 65536 KB [题目描述] 原题来自:Ural 1028 天空中有一些星星,这些星星都在不同的位置,每 ...
- BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...
- BZOJ2795&2890&3647[Poi2012]A Horrible Poem——hash
题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...
- BZOJ3590 SNOI2013Quare(状压dp)
可能作为最优解的边双都可以这样生成:初始时边双内只有一个点,每次选取边双内部两点(可以相同)和一个当前不在边双内的点集,以该两点为起止点找一条链(当然如果两点相同就是个环)将点集串起来,加入边双.状压 ...
- Js 百分比进度条
[构想] CSS3 + JS CSS3控制进度 利用CSS3中的 @keyframes JS实现百分比 根据CSS来调整,时间 [页面代码] 第一种: 默认直接进入就是下载 CSS代码 body { ...
- UVA11401-Triangle Counting-递推
给出一个数字n,计算从1到n能组成几个不同的三角形. n的范围是10^6,大概就是递推吧.从F[i-1]到F[i]可以线性求出.要注意结果超出int. #include <cstdio> ...
- MYSQL数据插入和更新的语法
tag:原文章地址 经常会遇到一行数据在特定条件下如果存在就更新列,不存在就插入新的行,用replace和duplicate语法都可以实现,但是也是有区别的.如果是数据覆盖就用replace,如果只是 ...
- 自学Zabbix11.1 Zabbix 配置SNMP监控
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix11.1 Zabbix 配置SNMP监控 1. 概述 zabbix采集数据方式: ...
- 【BZOJ2424】[HAOI2010]订货(费用流)
[BZOJ2424][HAOI2010]订货(费用流) 题面 BZOJ 洛谷 题解 傻逼费用流吧... 一开始理解错意思了,仓库大小为\(m\)的含义是留到下个月最多为\(m\),而不是任意时刻的容量 ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence | BSGS/exgcd/矩阵乘法
我诈尸啦! 高三退役选手好不容易抛弃天利和金考卷打场CF,结果打得和shi一样--还因为queue太长而unrated了!一个学期不敲代码实在是忘干净了-- 没分该没分,考题还是要订正的 =v= 欢迎 ...