基于TCP/IP协议下的Socket通信
2016-06-14 21:56
459 查看
首先,我用的软件是Netbeans,所以大家可以参考着以下代码,不需要全部复制,因为已经标注解释,希望能帮助大家!
客户端代码:
package javaapplication2; //这是同步式的方法
import java.net.*; //jar包
import java.io.*; //jar包
public class Client{ //类名
public static void main(String[]args) throws Exception /**抛出错误*/ {
Socket s =new Socket("192.168.0.30",9898);//输入Ip(随着局域网的改变,ip会改变,要输入目前的ip地址),和端口号
OutputStream os=s.getOutputStream(); //相当于一个输出管道,客户端必须要有一个接收管道(输入管道)
DataOutputStream dos=new DataOutputStream(os); //输出流
//Thread.sleep(5000);
dos.writeUTF("1!"); // 读的用dis写的用dos、向服务器发送信息dos.writeUTF("你好!我是1号机器!");
DataInputStream dis= new DataInputStream(s.getInputStream()); //输入管道
System.out.println("已经连接!"); //读取服务端发送到响应System.out.println(dis.readUTF());
dos.flush(); /**flush() 是清空,而不是刷新啊。
一般主要用在IO中,即清空缓冲区数据,
* 就是说你用读写流的时候,其实数据是先被读到了内存中,
* 然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,
* 因为还有一部分有可能会留在内存这个缓冲区中。
* 这时候如果你调用了 close()方法关闭了读写流,
* 那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。*/
dos.close(); //关闭dos
dis.close(); //关闭dis
s.close(); //关闭s
}
} 服务端代码:
package javaapplication2; //这是同步式的方法
import java.net.*;
import java.io.*;
public class Server { //类名
public static void main(String[] args) throws Exception/**抛出错误*/{
ServerSocket ss=new ServerSocket(6666); //定义服务器端口
System.out.println("服务器已经启动,等待连接....");
while(true) { //循环
Socket s = ss.accept(); //等待对方的连接
System.out.println("A connent");//客户端连接后输出值
DataInputStream dis= new DataInputStream(s.getInputStream()); //接收管道(输入管道)
System.out.println(dis.readUTF()); //对应客户端的dos.writeUTF("") 读的用dis写的用dos
//Thread.sleep(5000); 同样可以用在服务端,挂起5秒
OutputStream os=s.getOutputStream(); //构建输出管道
DataOutputStream dos=new DataOutputStream(os); //输出流
dos.writeUTF("欢迎连接!"); //向客户端发送的信息
System.out.println("注意先后次序"); //将会在dis.writeUTF("")输出之后“输出”
dis.close(); //关闭dis
dos.close(); //关闭dos
s.close(); //关闭s
}
}
}
客户端代码:
package javaapplication2; //这是同步式的方法
import java.net.*; //jar包
import java.io.*; //jar包
public class Client{ //类名
public static void main(String[]args) throws Exception /**抛出错误*/ {
Socket s =new Socket("192.168.0.30",9898);//输入Ip(随着局域网的改变,ip会改变,要输入目前的ip地址),和端口号
OutputStream os=s.getOutputStream(); //相当于一个输出管道,客户端必须要有一个接收管道(输入管道)
DataOutputStream dos=new DataOutputStream(os); //输出流
//Thread.sleep(5000);
dos.writeUTF("1!"); // 读的用dis写的用dos、向服务器发送信息dos.writeUTF("你好!我是1号机器!");
DataInputStream dis= new DataInputStream(s.getInputStream()); //输入管道
System.out.println("已经连接!"); //读取服务端发送到响应System.out.println(dis.readUTF());
dos.flush(); /**flush() 是清空,而不是刷新啊。
一般主要用在IO中,即清空缓冲区数据,
* 就是说你用读写流的时候,其实数据是先被读到了内存中,
* 然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,
* 因为还有一部分有可能会留在内存这个缓冲区中。
* 这时候如果你调用了 close()方法关闭了读写流,
* 那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。*/
dos.close(); //关闭dos
dis.close(); //关闭dis
s.close(); //关闭s
}
} 服务端代码:
package javaapplication2; //这是同步式的方法
import java.net.*;
import java.io.*;
public class Server { //类名
public static void main(String[] args) throws Exception/**抛出错误*/{
ServerSocket ss=new ServerSocket(6666); //定义服务器端口
System.out.println("服务器已经启动,等待连接....");
while(true) { //循环
Socket s = ss.accept(); //等待对方的连接
System.out.println("A connent");//客户端连接后输出值
DataInputStream dis= new DataInputStream(s.getInputStream()); //接收管道(输入管道)
System.out.println(dis.readUTF()); //对应客户端的dos.writeUTF("") 读的用dis写的用dos
//Thread.sleep(5000); 同样可以用在服务端,挂起5秒
OutputStream os=s.getOutputStream(); //构建输出管道
DataOutputStream dos=new DataOutputStream(os); //输出流
dos.writeUTF("欢迎连接!"); //向客户端发送的信息
System.out.println("注意先后次序"); //将会在dis.writeUTF("")输出之后“输出”
dis.close(); //关闭dis
dos.close(); //关闭dos
s.close(); //关闭s
}
}
}
相关文章推荐
- 利用Wireshark 解密HTTPS流量
- Android网络编程(一)
- 【网络流24题----01】飞行员配对方案问题
- nginx做前端反代负载均衡,后端httpd+tomcat
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决(转)
- 【51CTO学院三周年】藏头诗一首送祝福
- 阿里云 CentOS6.7 PHP5.2.17 lighttpd GD库 安装配置记录
- 最小连通网络
- libpcap/tcpdump filter 语法
- 线程与网络编程(第六节:通信协议与TCP socket初识)
- linux网络编程--TCP/IP协议
- MyAsyAsyncTask工具类网络请求HttpClient
- Deep Learning(深度学习)学习笔记整理系列之(七)Convolutional Neural Networks卷积神经网络
- 强大的请求网络图片并自动缓存的第三方框架------Picasso
- TCP/IP源码(59)——TCP中的三个接收队列
- Android中的TCP协议与UDP协议
- ServiceMetadataBehavior 的 HttpsGetEnabled 属性设置为 True,而 HttpsGetUrl 属性是相对地址,但没有 https 基址
- 学习笔记——Retrofit2.0的简单使用
- HttpClient 4.3教程(转载)
- 网络请求接口封装方式