java网络编程概念

java网路编程都是基于tcp/ip协议基础上,致力于实现应用层,传输层(tcp/ip)向应用层提供了套接字socket接口,socket封装了向下层(网络层ip)传输数据的细节,应用层有ftp http https telnet等。应用层通过socket与远程建立链接,实现远程通信。java.net包下为我们提供了3种套接字类Socket,serverSocket,DatagramSocket。这里演示一个socket和serverSocket例子
服务端:
public class BioServer {

private ServerSocket server;

public BioServer() throws IOException {
//服务端启动注册服务,监听客户端连接
server = new ServerSocket(8080); //线程不断监听此端口
System.out.println("服务已启动");
}

/**
* 通过socket获取输出流,这样就能向客户端发送数据了
* @param socket
* @return
* @throws IOException
*/
private PrintWriter getWriter(Socket socket ) throws IOException {
if (socket == null) {
throw new RuntimeException("socket不能为空");
}
PrintWriter pw = new PrintWriter(socket.getOutputStream());
return pw;
}

/**
* 获取输入流封装成buffer,读取客户端发送的数据.
* @param socket
* @return
* @throws IOException
*/
public BufferedReader getReader(Socket socket) throws IOException {
if (socket == null) {
throw new RuntimeException("socket不能为空");
}
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
return br;
}

/**
* 核心方法.
*/
public void service() {
while (true) {
Socket socket = null;
try {
socket = server.accept();
BufferedReader reader = getReader(socket);
PrintWriter pw = getWriter(socket);
String line = null;
//读取客户端数据
while ((line = reader.readLine()) != null) {
System.out.println(line);
if (line.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

}
在整个service方法处理中,只有一个线程处理请求,这里是同步的,只有处理完上次请求,才能重新accept接收下一次请求并处理
客户端:
public class BioClient {

private String localHost = "127.0.0.1";
private int port = 8080;
private Socket socket;

public BioClient() throws UnknownHostException, IOException {
socket = new Socket(localHost, port);
System.out.println("客户端发起请求链接");
}


/**
* 通过socket获取输出流,这样就能向客户端发送数据了
* @param socket
* @return
* @throws IOException
*/
private PrintWriter getWriter(Socket socket ) throws IOException {
if (socket == null) {
throw new RuntimeException("socket不能为空");
}
PrintWriter pw = new PrintWriter(socket.getOutputStream());
return pw;
}

/**
* 获取输入流封装成buffer,读取客户端发送的数据.
* @param socket
* @return
* @throws IOException
*/
public BufferedReader getReader(Socket socket) throws IOException {
if (socket == null) {
throw new RuntimeException("socket不能为空");
}
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
return br;
}

public void talk() {
BufferedReader reader = null;
PrintWriter pw = null;
try {
reader = getReader(socket);
pw = getWriter(socket);
BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); //从控制台读取数据传给服务端
String message = null;
while ((message = localReader.readLine()) != null) {
pw.print(message);
//读取服务端返回消息
String str = reader.readLine();
if (str.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值