欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Socket实现简易聊天室,Client,Server

程序员文章站 2022-03-21 18:09:07
package seday08; import java.io.BufferedWriter;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.ne ......

package seday08;

import java.io.bufferedwriter;
import java.io.outputstream;
import java.io.outputstreamwriter;
import java.io.printwriter;
import java.net.socket;
import java.util.scanner;

/**
* @author xingsir
*简易聊天室客户端
*/
public class client {
/*
* 套接字 java.net.socket
* socket封装了底层tcp协议的通讯细节,使用它可以通过
* tcp协议与服务端建立链接,并以两条流进行io操作完成 与服务端的数据交换
*/
private socket socket;//声明了一个 socket类型的对象
//构造方法
public client() {
try {

system.out.println("正在连接服务器。。。。。。");
socket =new socket("localhost",33069);//端口范围0-65535
system.out.println("已成功连接服务端!");
} catch (exception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
/*
* 客户端开始工作的方法
*/
public void start() {

try {
outputstream out = socket.getoutputstream();//客户端的socket对象上的getoutputstream方法得到的输出流其实就是发送给服务器端的数据。
outputstreamwriter osw= new outputstreamwriter(out);//字符转字节流
bufferedwriter bw=new bufferedwriter(osw);//缓冲流
printwriter pw =new printwriter(bw,true);//行更新
scanner scanner=new scanner(system.in);//控制台输入,获取键盘输入信息
while(true) {//条件为真
string message=scanner.nextline();
pw.println(message);
}
} catch (exception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}

public static void main(string[] args) {
//实例化一个客户端
client client = new client();
//调用启动方法
client.start();

}

}

//===================================================================================

package seday08;

import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstream;
import java.io.inputstreamreader;
import java.net.serversocket;
import java.net.socket;
/**
* @author xingsir
* 服务器端
*/
public class server {
private serversocket server;//声明了一个serversocket类型的对象
//构造方法
public server() {
try{
system.out.println("服务器正在启动。。。。。。");
server = new serversocket(33069);//接受的端口号
system.out.println("服务端启动完毕!");
}catch (ioexception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
//服务端工作方法
public void start() {
try {
while(true) {
system.out.println("等待客户端连接。。。。。。");
socket socket =server.accept();//accept():接受客户端的连接请求,并返回一个套接字
system.out.println("一个客户端链接了!");
/*
* socket提供的方法:inputstream getinputstream()
* 通过socket获取的输入流读取的字节是来自 远端计算机发送过来的字节。
*/
inputstream in = socket.getinputstream();
//将字节转换为字符
inputstreamreader isr= new inputstreamreader(in,"utf-8");
bufferedreader br= new bufferedreader(isr);//块读,并且可以按行读取字符串

string message = null;//声明字符串message,初始化呢为空
/*
* 通过bufferedreader读取客户端发送过来的一行字符串这个操作中,当客户端断开连接时,
* 由于 客户端系统不同,服务端这里的表现也不相同:
* windows客户端断开时,readline方法会直接抛出异常
* linux客户端断开连接时,readline方法会返回 为null
*/
while((message = br.readline())!=null) {
system.out.println("来自客户端的消息说:"+message);//控制台打印消息
}

}
} catch (exception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}

public static void main(string[] args) {
//实例化一个server端
server server = new server();
server.start();//调用方法
}

}