服务端

package testlxd;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner; public class Server_Test extends Thread {
ServerSocket server = null;
Socket socket = null; public Server_Test(int port) {
try {
server = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void run() { super.run();
try {
System.out.println(getdate() + " 等待客户端连接...");
socket = server.accept();
new sendMessThread().start();// 连接并返回socket后,再启用发送消息线程
System.out.println(getdate() + " 客户端 (" + socket.getInetAddress().getHostAddress() + ") 连接成功...");
InputStream in = socket.getInputStream();
int len = 0;
byte[] buf = new byte[1024];
while ((len = in.read(buf)) != -1) {
System.out.println(getdate() + " 客户端: ("
+ socket.getInetAddress().getHostAddress() + ")说:"
+ new String(buf, 0, len, "UTF-8"));
} } catch (IOException e) {
e.printStackTrace();
}
} public static String getdate() {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String result = format.format(date);
return result;
} class sendMessThread extends Thread {
@Override
public void run() {
super.run();
Scanner scanner = null;
OutputStream out = null;
try {
if (socket != null) {
scanner = new Scanner(System.in);
out = socket.getOutputStream();
String in = "";
do {
in = scanner.next();
out.write(("" + in).getBytes("UTF-8"));
out.flush();// 清空缓存区的内容
} while (!in.equals("q"));
scanner.close();
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
} } } // 函数入口
public static void main(String[] args) {
Server_Test server = new Server_Test(1234);
server.start();
}
}

客户端

package testlxd;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner; public class Client extends Thread { //定义一个Socket对象
Socket socket = null; public Client(String host, int port) {
try {
//需要服务器的IP地址和端口号,才能获得正确的Socket对象
socket = new Socket(host, port);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } @Override
public void run() {
//客户端一连接就可以写数据给服务器了
new sendMessThread().start();
super.run();
try {
// 读Sock里面的数据
InputStream s = socket.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while ((len = s.read(buf)) != -1) {
System.out.println(getdate() + " 服务器说: "+new String(buf, 0, len,"UTF-8"));
}
} catch (IOException e) {
e.printStackTrace();
}
} //往Socket里面写数据,需要新开一个线程
class sendMessThread extends Thread{
@Override
public void run() {
super.run();
//写操作
Scanner scanner=null;
OutputStream os= null;
try {
scanner=new Scanner(System.in);
os= socket.getOutputStream();
String in="";
do {
in=scanner.next();
os.write((""+in).getBytes());
os.flush();
} while (!in.equals("bye"));
} catch (IOException e) {
e.printStackTrace();
}
scanner.close();
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static String getdate() {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String result = format.format(date);
return result;
} //函数入口
public static void main(String[] args) {
//需要服务器的正确的IP地址和端口号
Client clientTest=new Client("127.0.0.1", 1234);
clientTest.start();
}
}

运行效果:

服务端

客户端

以上就是Socket的简单通信实例,实际开发过程按需修改即可,若遇到乱码问题,可尝试通过以下代码进行修改

in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));

最新文章

  1. 深入理解javascript函数定义与函数作用域
  2. Unity全视角游戏的键盘操作位移——研究笔记
  3. PHP实现CSV大文件数据导入到MYSQL数据库
  4. SQL批量添加主键脚本
  5. WPF MenuItem 四种角色分析
  6. 【VirtualBox】端口转发,ssh
  7. java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet的解决方案
  8. 最大后验估计(MAP)
  9. js用for循环为对象添加事件并传递参数
  10. Code-Based Configuration (EF6 onwards)
  11. STF,docker学习资料整理
  12. 总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)
  13. BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图
  14. css3 之炫酷的loading效果
  15. django-form字段form 和插件widgets
  16. 阿里云-免费SSL证书申请及验证步骤
  17. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 即时消息提醒功能改进
  18. 六、input框中的数字(金额)只能输入正整数
  19. 【NOIP2017D2T3】列队
  20. 微信小程序开发--第一个项目

热门文章

  1. centos 安装mysql8.0.16
  2. wraps补充
  3. Java8实战及自己的总结
  4. 【C++】虚函数的实现机制
  5. 解决新版本R3.6.0不能加载devtools包问题
  6. PowerBuilder学习笔记之1开发环境
  7. Python中的垃圾回收机制(转)
  8. inux centos7下源码 tar安装5.7.26详解
  9. 【LeetCode】387. First Unique Character in a String
  10. Kafka跨集群迁移方案MirrorMaker原理、使用以及性能调优实践