博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java使用socket实现客户端与服务器聊天(一)实现终端模拟聊天
阅读量:3949 次
发布时间:2019-05-24

本文共 2883 字,大约阅读时间需要 9 分钟。

前两天,开始做一个简单的客户端与服务器进行聊天的程序,但是发现很多大佬写的以及视频教程中,仅仅是单向交流(只能由客户端向服务端发送消息,服务端打印输出),后来我用一个循环在两者代码互相加了一点代码,解决了这个毛病,但是又有了新的问题,只能由一方发送,一方接受,接收完才可以进行下面的任务,无限的等待啊,啊啊啊

在一番摸索,线程这两字频频的出现在我的眼前!我的问题也在其慢慢解决!
此文章也是用线程初次完善。

正文开始:

服务器代码:

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket; public class Server {
public static void main(String[] args) {
ServerSocket server; Socket socket; try {
server=new ServerSocket(5252); socket = server.accept(); In ta=new In(socket); Out te=new Out(socket); new Thread(ta).start(); new Thread(te).start(); } catch (IOException e) {
e.printStackTrace(); } } }

客户端代码:

import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner; public class Client {
public static void main(String[] args) {
Socket socket; try {
socket = new Socket("localhost",5252); In ta=new In(socket); Out te=new Out(socket); new Thread(ta).start(); new Thread(te).start(); } catch (UnknownHostException e) {
// TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) {
// TODO 自动生成的 catch 块 e.printStackTrace(); } }}

因为客户端与服务器端都有相同的功能,实现起来也是完全一致,这个也是文章的重点,使用接口Runnable,一个是输出流,一个输入流实现,可写,可读

In类:

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Socket;public class In implements Runnable {
private Socket socket; public In(Socket socket) {
this.socket=socket; } public void run() {
// TODO 自动生成的方法存根 try {
InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); BufferedReader br = new BufferedReader(isr); while(true){
System.out.println("客户端说:" + br.readLine()); } } catch (Exception e) {
// TODO Auto-generated catch block e.printStackTrace(); } }}

Out类:

import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.util.Scanner;public class Out implements Runnable{
Scanner sc=new Scanner(System.in); private Socket socket; public Out(Socket socket) {
this.socket=socket; } @Override public void run() {
// TODO 自动生成的方法存根 while(true) {
OutputStream out; try {
out = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8"); PrintWriter pw = new PrintWriter(osw, true); //创建Scanner读取用户输入内容 Scanner scanner = new Scanner(System.in); String ft=null; while(true){
ft=sc.next(); pw.println(scanner.nextLine()); } } catch (IOException e) {
// TODO 自动生成的 catch 块 e.printStackTrace(); } } }}

启发大佬

转载地址:http://rarwi.baihongyu.com/

你可能感兴趣的文章
Apache服务器搭建方法
查看>>
Mac终端常用命令
查看>>
常用算法-冒泡排序代码实现
查看>>
swift 中的 感叹号 问号 和 双问号用法详解
查看>>
C代码:二分法求三次方程近似根
查看>>
swift-自己封装的一个网络工具
查看>>
APP第三方登录实现步骤
查看>>
iOS-数据存储方式介绍
查看>>
KVO & KVC 比较 - KVC
查看>>
iOS-tableView联动
查看>>
iOS--Masonry解决 tableViewCell 重用时约束冲突
查看>>
git 与 svn 的主要区别!
查看>>
iOS-截屏,从相册选择图片,制作磨砂效果图片
查看>>
iOS-截取字符串中两个指定字符串中间的字符串
查看>>
数据库-数据库操作(使用FMDB)
查看>>
swift-计算型属性和存储型属性的区别
查看>>
FMDB介绍以及在 swift 中的数据库操作
查看>>
iOS运行时机制(附Demo演练)
查看>>
iOS-利用运行时给分类添加属性
查看>>
整理的最新WebSHell (php过狗一句话,过狗菜刀,2016过狗一句话,2016php免杀一句话)
查看>>