026.3 网络编程 TCP聊天
分为客户端和服务端,分别进行收发操作
##########################################################################
客户端:
###思路:
1、建立tcp客户端服务
1.1因为是面向连接,必须有连接才有通信
1.2在创建客户端时,就必须明确目的地址和端口
2、一旦连接建立,就有了传输数据的通道。就可以在通道中进行数据传输,这个传输是通过流实现的,是socket io流
3、获取socket io中的写动作就可以发送给服务端
###步骤:
1、创建socket对象,明确目的IP和端口
2、通过socket对象的getOutStream方法获取OutputStream对象
3、通过OutputStream对象写数据,实现发送
4、关闭socket对象
###代码:
System.out.println("client start");
//1、创建客户端对象,明确目的和端口
Socket s = new Socket("192.168.10.141",10000);
//2、获取socket流中的输出流,将数据发送给服务端
OutputStream out = s.getOutputStream();
//3、通过输出流写数据
out.write("I miss you".getBytes());
//4、关闭资源
s.close();
####################################################################
服务端:
###思路:
1、创建socket服务器端服务。服务器监听一个端口
2、获取客户端对象
3、获取客户端的socket流的读取流
4、显示
###步骤:
1、创建ServerSocket服务器对象
2、通过ServerSocket对象的accept方法,获取客户端socket对象
3、通过客户端socket对象的getInetAddress().getHostAddress() 方法获取ip对象然后获取ip
4、通过客户端socket对象的getInputStream方法获取InputStream对象
5、通过InputStream对象的read方法获取客户端发送的数据。
6、关闭客户端socket对象。
###代码:
System.out.println("服务器启动。。。");
//1、创建服务器端对象
ServerSocket ss = new ServerSocket(10003);
//2、获取客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"...connect");
//3、通过客户端对象获取socket流的读取流
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); s.close();
################################################################################
简单互动的TCP通讯
/*###
* 案例二:实现客户端和服务端的收发过程。
* 客户端
*/
System.out.println("客户端2 启动.......");
// 创建客户端socket对象。明确服务端地址和端口。
Socket s = new Socket("192.168.1.223", 10004);
// 发送数据,通过socket输出流完成。
OutputStream out = s.getOutputStream();
out.write("服务端,我来了".getBytes());
// 读取服务端返回的数据,通过socket输入流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
// 关闭资源。
s.close();
/*###
* 案例二:实现客户端和服务端的收发过程。 服务器端。
*/
System.out.println("服务端2启动.....");
// 创建tcp服务端socket 明确端口。
ServerSocket ss = new ServerSocket(10004);
while (true) {
// 获取客户端对象。
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()
+ ".....connected");
// 读取客户端的发送过来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(text);
// 给客户端回馈数据。
OutputStream out = s.getOutputStream();
out.write("客户端,我已到收到,哦耶!".getBytes());
// 关闭客户端
s.close();
}
// 关闭服务端。如果不断的获取客户端,不用关闭服务端。
// ss.close();
###########################################################################
我想写一个可以多次发送信息的程序,没有找到哪里错了
public class TCPServer2
{
public static void main(String[] args) throws IOException
{
ServerSocket ss = new ServerSocket(10005);
Socket s = ss.accept();
ServerReceive sr = new ServerReceive(s);
ServerSend ssend = new ServerSend(s);
new Thread(sr).start();
new Thread(ssend).start();
}
} class ServerSend implements Runnable{
private Socket s;
private OutputStream os;
public ServerSend(Socket s) throws IOException {
super();
this.s = s;
os = s.getOutputStream();
} @Override
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while((line = br.readLine()) != null){ os.write(line.getBytes()); if("//over".equals(line)){
break;
}
}
s.close();
} catch (IOException e) {
}
}
} class ServerReceive implements Runnable{
private Socket s;
private InputStream is;
public ServerReceive(Socket s) throws IOException {
super();
this.s = s;
is = s.getInputStream();
} @Override
public void run()
{
while(true){
byte[] buf = new byte[1024];
try {
int len = is.read(buf);
String str = new String(buf,0,len);
if("//over".equals(str)){
break;
}
System.out.println(str);
s.close();
} catch (IOException e) {
}
}
}
}
TCPServer
public class TCPClient2
{
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket bothSocket = new Socket("127.0.0.1",10005);
Send2 send = new Send2(bothSocket);
Receive2 receive = new Receive2(bothSocket); new Thread(send).start();
new Thread(receive).start(); }
} //创建发送和接收的类,使用多线程,继承runnable接口
//多线程发送类
class Send2 implements Runnable{
private Socket s;
OutputStream os;
public Send2(Socket s) throws IOException {
super();
this.s = s;
os = s.getOutputStream();
}
@Override
public void run()
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while((line = br.readLine()) != null){ os.write(line.getBytes()); if("//over".equals(line)){
break;
}
}
s.close();
} catch (IOException e) {
}
}
} //多线程接收类
class Receive2 implements Runnable{
private Socket s; private InputStream is;
public Receive2(Socket s) throws IOException {
super();
this.s = s;
} @Override
public void run()
{
while(true){
byte[] buf = new byte[1024];
try {
is = s.getInputStream();
int len = is.read(buf);
String str = new String(buf,0,len);
if("//over".equals(str)){
break;
}
System.out.println(str);
s.close();
} catch (IOException e) {
}
}
}
}
TCPClient
026.3 网络编程 TCP聊天的更多相关文章
- 026.2 网络编程 UDP聊天
实现,通过socket对象 ##############################################################需求建立UDP发送端:###思路:1.建立可以实 ...
- 网络编程TCP协议-聊天室
网络编程TCP协议-聊天室(客户端与服务端的交互); <span style="font-size:18px;">1.客户端发数据到服务端.</span> ...
- 网络编程——TCP协议、UDP协议、socket套接字、粘包问题以及解决方法
网络编程--TCP协议.UDP协议.socket套接字.粘包问题以及解决方法 TCP协议(流式协议) 当应用程序想通过TCP协议实现远程通信时,彼此之间必须先建立双向通信通道,基于该双向通道实现数 ...
- 32.网络编程TCP/UDP服务
网络编程TCP: 服务器端口了解: port:0~65535 web服务:80 邮箱服务:556 0~1024:为服务默认的公认端口,一般我们不能用 套接字:socket socket作用 ip:po ...
- GO语言练习:网络编程 TCP 示例
1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 package main import ( "net" "os" &qu ...
- C#网络编程TCP通信实例程序简单设计
C#网络编程TCP通信实例程序简单设计 采用自带 TcpClient和TcpListener设计一个Tcp通信的例子 只实现了TCP通信 通信程序截图: 压力测试服务端截图: 俩个客户端链接服务端测试 ...
- Socket网络编程(TCP/IP/端口/类)和实例
Socket网络编程(TCP/IP/端口/类)和实例 原文:C# Socket网络编程精华篇 转自:微冷的雨 我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次 ...
- Socket网络编程-TCP编程
Socket网络编程-TCP编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.socket介绍 1>.TCP/IP协议 2>.跨网络的主机间通讯 在建立通信连接的 ...
- 网络编程TCP/IP详解
网络编程TCP/IP详解 1. 网络通信 中继器:信号放大器 集线器(hub):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...
随机推荐
- 转载:SQL按照日、周、月、年统计数据的方法
转载源:http://www.jb51.net/article/42613.htm SQL按照日.周.月.季度.年统计数据的方法 方式一: --按日 select sum(consume),day([ ...
- springboot面试专题及答案
声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话 问题一 什么是 Spring Boot? 多年来,随着新功能的增加,spring 变得越来越复杂.只需 ...
- 现代 C++ 编译时 结构体字段反射
基于 C++ 14 原生语法,不到 100 行代码:让编译器帮你写 JSON 序列化/反序列化代码,告别体力劳动.
- ACK-Ackermann, 阿克曼函数
以前好几次在学语言的使用都有实现这个ack函数的经历,今天读本算法书,偶尔又提到了这个,查了下wiki来头好大 Values of A(m, n) m\n 0 1 2 3 4 n 0 1 2 3 4 ...
- HDU4336 Card Collector(期望 状压 MinMax容斥)
题意 题目链接 \(N\)个物品,每次得到第\(i\)个物品的概率为\(p_i\),而且有可能什么也得不到,问期望多少次能收集到全部\(N\)个物品 Sol 最直观的做法是直接状压,设\(f[sta] ...
- 纯css修改复选框默认样式
input[type='checkbox']{ width: 20px; height: 20px; background-color: #fff; -webkit-appearance:none; ...
- ios 下拉列表
#import <UIKit/UIKit.h> @class FVPullDownMenu; /** 指示器状态*/ typedef enum { IndicatorStateShow = ...
- leaflet 整合 esri
此 demo 通过 proj4js 将 leaflet 与 esri 整合起来,同时添加了 ClusteredFeatureLayer 的支持. 下载 <html> <head> ...
- 怎么配置eclipse的联想功能
第一步:打开Eclipse,windows下,打开“window”→“Preferences” :mac下,打开“偏好设置”. 第二步:选择“Java”,展开,“Editor”,选择“Content ...
- sql 单表查询练习
-- 工资高于3000的员工select * from emp where sal > 3000;-- 工资在2500和3000之间的员工select * from emp where sal ...