文章目录
一.单条消息示例
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo2 {
public static void main(String[] args) {
try {
System.out.println("=====TCP Server Started=====");
ServerSocket ss = new ServerSocket(7777);
/**这个ServerSocket仅仅是注册了一个服务端口
* 下面这句才是新建套接字*/
Socket soc = ss.accept();
/**套接字对象才有这个方法,get一个原始的字节输入流*/
InputStream is = soc.getInputStream();
/**此处,把上面字节输入流用转换输入流包装,在包装进缓冲字符输入流*/
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;//用来存消息的字符串变量
if ((msg = br.readLine()) != null){
System.out.println(soc.getRemoteSocketAddress()+"has send: "+msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送端
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
public class TcpClientDemo1 {
public static void main(String[] args) throws Exception {
System.out.println("=====TCP Client Started=====");
//新建套接字对象,ip是对方IP,这里就是我本机,端口也是对方端口
Socket soc = new Socket("127.0.0.1",7777);
//套接字可以get一个字节输出流
OutputStream os = soc.getOutputStream();
//用打印流包装起来
PrintStream ps = new PrintStream(os);
ps.println("Are you ready?");
ps.flush();
// soc.close();
}
}
文章目录
二.单线程连续消息发送
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServerDemo2 {
public static void main(String[] args) {
System.out.println("====TCP Server Started====");
Socket soc = new Socket();//这里新建soc是为了让catch语句可以读到
try {
ServerSocket ss = new ServerSocket(5555);
soc = ss.accept();//这个accept方法会一直等待对方发送消息,soc本来可以在这里新建,但为了下线提示语句放到try上面了
System.out.println(soc.getRemoteSocketAddress()+" he came~~~");
//用Socket得到一个原始字节输入流
InputStream is = soc.getInputStream();
//缓冲字符输入流 转换流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg;
while ((msg = br.readLine()) != null){
System.out.println(soc.getRemoteSocketAddress()+" has sent: "+msg);
}
//如果对方关闭了socket,那么本方也会自动关闭,干净利落,如果对方没写soc.close(),会异常
} catch (IOException e) {
// e.printStackTrace();
/**
* 用原始这句,对方非soc.close()掉线就会报异常,java.net.SocketException: Connection reset
* at d6_TCP_COM_multiMsg.TcpServerDemo2.main(TcpServerDemo2.java:21)
* 第21行,就是 while ((msg = br.readLine()) != null)
*/
System.out.println(soc.getRemoteSocketAddress()+" he left~~~");
}
}
}
发送端
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class TcpClientDemo1 {
public static void main(String[] args) {
System.out.println("====TCP Client Started====");
try {
Socket soc = new Socket("127.0.0.1",5555);
//用socket得到一个原始字节输出流
OutputStream os = soc.getOutputStream();
//把原始字节输入流包装成打印流
PrintStream ps = new PrintStream(os);
Scanner sc = new Scanner(System.in);
String msg;
while (true){
System.out.println("Input what are you want to send:");
msg = sc.nextLine();
if ("exit".equals(msg)){
break;
}
ps.println(msg);
ps.flush();
}
// soc.close();//本例写这句,关闭soc之后,会话断开,对方也会断开,现象在控制台可见,干净利落,无异常,不写有
} catch (IOException e) {
e.printStackTrace();
}
}
}