1.通信过程
网络分为应用层,http、ssh、telnet就是属于这一类,建立在传输层的基础上、其实就是定义了各自的编码解码格式,分层如下:

2.Socket连接

上述通信都要先在传输层有建立连接的基础上才能完成,TCP通过三次握手建立连接:
 

Socket与http的区别可以看下这个:
https://www.cnblogs.com/meier1205/p/5971313.html
还有搜索:http下午茶

3.JAVA socket 客户端与服务端互发消息
实现结构图:
 

客户端和服务端分别通过俩个线程来完成发送消息和接受消息,此前需要等待客户端与服务器端建立连接,这个java程序都帮你写好了,接收后就可以发消息了:

服务端代码:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
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("wait client connect...");
socket = server.accept();
new sendMessThread().start();//连接并返回socket后,再启用发送消息线程
System.out.println(socket.getInetAddress().getHostAddress()+"SUCCESS TO CONNECT...");
InputStream in = socket.getInputStream();
int len = 0;
byte[] buf = new byte[1024];
while ((len=in.read(buf))!=-1){
System.out.println("client saying: "+new String(buf,0,len));
} }catch (IOException e){
e.printStackTrace();
}
} 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(("server saying: "+in).getBytes());
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();
}
}

客户端代码

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
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(new String(buf, 0, len));
} } 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 void main(String[] args) {
//需要服务器的正确的IP地址和端口号
Client clientTest=new Client("127.0.0.1", 1234);
clientTest.start();
}
}

自己改写的,主要变化在于不用那么费事的读写

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList; public class LuClient extends Thread { //定义一个Socket对象
Socket socket = null; public LuClient(String host,int post){
Exception q=null;
while(true){
try {
socket = new Socket(host,post); } catch (Exception e) {
q=e;
}finally{
if(q==null)
break;
else
continue;
}
} } @Override
public void run() {
//客户端一连接就可以写数据个服务器了
//new sendMessThread().start();
super.run();
// 读Sock里面的数据
try {
InputStream is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String message=null;
while((message=br.readLine())!=null) {
if(message.equals("kaishichongxinguihua")) {
new sendMessThread().start();
}
} } catch (IOException e) {
e.printStackTrace();
}
} //往Socket里面写数据,需要新开一个线程
class sendMessThread extends Thread{
@Override
public void run() {
super.run();
//写操作
ArrayList<String> array=new ArrayList<String>();
int N = 1000;
int[][] Graph = {
{ 0, 1, 1, N, N, 1, N, N, N },
{ 1, 0, N, N, N, N, 1, N, N },
{ 1, N, 0, 1, 1, N, N, N, N },
{ N, N, 1, 0, N, N, N, N, N },
{ N, N, 1, N, 0, N, N, 1, N },
{ 1, N, N, N, N, 0, N, N, N },
{ N, 1, N, N, N, N, 0, 1, N },
{ N, N, N, N, 1, N, 1, 0, 1 },
{ N, N, N, N, N, N, N, 1, 0 } };
array=Dijkstra.dijkstra(0, Graph,8); try{
OutputStream out= socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(out);
PrintWriter pw = new PrintWriter(osw, true);
pw.println("chongxinguihuahaole"); }catch(Exception e){
//e.printStackTrace();
} }
}
//函数入口
public static void main(String[] args) {
//需要服务器的正确的IP地址和端口号
LuClient clientTest=new LuClient("192.168.31.126",8090);
clientTest.start();
}
}

java Socket通信,客户端与服务端相互发消息的更多相关文章

  1. netty-2.客户端与服务端互发消息

    (原) 第二篇,客户端与服务端互发消息 与第一篇的例子类似,这里服务端需要三个类,客户端也需要三个类. 服务端关键代码如下:MyServer与上一个例子中的TestServer 差多,这里只列举不同的 ...

  2. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  3. Socket通信客户端和服务端代码

    这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...

  4. Java 实现Redis客户端,服务端

    Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...

  5. 用PHP的socket实现客户端到服务端的通信

    服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...

  6. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

  7. 基于socket.io客户端与服务端的相互通讯

    socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先 ...

  8. java网络编程客户端与服务端原理以及用URL解析HTTP协议

    常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...

  9. C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

随机推荐

  1. pyhton3之进程

    一 什么是进程 首先要了解什么是进程,程序是写出来没有被执行的代码,它是没有生命的实体,只有处理器赋予程序生命时,及程序被操作系统运行起来,他是一个活动的实体,我们称其为进程. 进程是计算机中的程序关 ...

  2. LeetCode.509——斐波那契数

    问题描述: 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...

  3. 闲谈一下,ES3、ES4、ES5、ES6 分别是什么

    上图按照时间顺序说明了JavaScript.JScript和ECMAScript的发展. 显示在网景工作的Brendan Eich临危受命,用十天时间设计出LiveScript的第一个版本.临时发布前 ...

  4. Pycharm2018.3.5永久破解

    声明:不做商业用途,电脑系统win10专业版,亲测有效. 首先:可以先去lookdiv.com钥匙:lookdiv.com去使用更新的激活码,免费版的有效期待考量. 或者:可以下面方式破解 注意:破解 ...

  5. SpringMVC之Controller层最佳实践

    规范设置接口, 有利于项目的可扩展性,提高前后端的交互特性. 请求参数 响应结果

  6. asp.net core系列 WebAPI 作者:懒懒的程序员一枚

    asp.net core系列 36 WebAPI 搭建详细示例一.概述1.1 创建web项目1.2 添加模型类1.3 添加数据库上下文1.4 注册上下文1.5 添加控制器1.6 添加Get方法1.7 ...

  7. 2020.2.22 bzoj5336 party

    #include<iostream> #include<cstdio> #include<cstring> #include<cctype> #incl ...

  8. php 截取字符串长度 并 把超出规定长度的内容用...替代

    <?php header("content-type:text/html;charset=utf-8");#设置文件编码 error_reporting(E_ALL);#设置 ...

  9. pytorch --Rnn语言模型(LSTM,BiLSTM) -- 《Recurrent neural network based language model》

    论文通过实现RNN来完成了文本分类. 论文地址:88888888 模型结构图: 原理自行参考论文,code and comment: # -*- coding: utf-8 -*- # @time : ...

  10. bat常用符合和for语句等

    一.开头 @echo off(默认是echo on)@echo off执行以后,后面所有的命令均不显示,包括本条命令 二.特殊符号 1. | 命令管道符,echo Y|rd /s c:\abc,通过管 ...