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):是中继器的一种形式,区别在于集线器能够提供多端口服务,多口中继器,每个数据包的发送都是以广播的形式进行的,容易阻塞网络. ...
随机推荐
- 常用工具说明--mysql数据库安装
MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...
- 14.Iterator 和 for...of 循环
Iterator 和 for...of 循环 Iterator 和 for...of 循环 Iterator(遍历器)的概念 JavaScript 原有的表示"集合"的数据结构,主 ...
- 转载:SQL按照日、周、月、年统计数据的方法
转载源:http://www.jb51.net/article/42613.htm SQL按照日.周.月.季度.年统计数据的方法 方式一: --按日 select sum(consume),day([ ...
- VIM命令图解
右键在新窗口打开查看大图 删除所有:dG 来源见水印
- eclipse编译项目:Java @Override 注解报错的解决方法
错误: 在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显示让我们去掉 @override 注解,如图: 原因: @Override 是 jdk5 引入的机制,但 ...
- 高性能分布式锁-redisson
RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...
- 从api接口获取数据-okhttp
首先先介绍下api接口: API:应用程序接口(API:Application Program Interface) 通常用于数据连接,调用函数提供功能等等... 从api接口获取数据有四种方式:Ht ...
- zoj Calculate the Function
Calculate the Function Time Limit: 2 Seconds Memory Limit: 65536 KB You are given a list of num ...
- Java8简明学习之Optional
Java在8的版本,新增了Optional和lambda表达式,使得日常开发中对于NullPointException的判断变的优雅. 现在来个例子看看在Optional之前对空的判断. @Test ...
- c#如何仅在datatgirdview控件的头部(列名处)添加右键菜单
近期在弄ArcgisAE实习,其中有一个功能是需要操作图层的属性字段的,为了方便操作图层的属性,最好是在图层的属性表中,也就是在显示图层属性的DataGirdView控件的头部添加一个右键菜单来实现相 ...