一,了解之前先了解一下网络基础

首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程

一般的网络编程都称为Socket编程,Socket的英文意思是“插座”

网络编程的目的:直接或者间接的通过网络协议与其他计算机进行通信。

网络编程中有两个主要的问题:

-->如何准确定为网络上一台或者多台主机:IP和端口号

-->找到主机后如何可靠搞笑的进行数据传输:Tcp/Ip 协议(四层)

二,网络通信要素

网络通信要素1:IP地址,通过Ip,可以唯一的定为互联网上的一台主机

    ip地址唯一定为一台主机,而端口号定为主机上的某一个正在运行的软件

通讯要素2:网络通信协议TCP/IP协议

三,TCP编程案例1:客户端给服务端发消息,服务端输出此消息到控制台

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str+"\n");
System.out.println("收到来自"+st.getInetAddress().getHostAddress()+"的请求并已回应");
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

TCP编程案例2:客户端给服务端发消息,服务端输出此消息到控制台,同时发送已收到信息给客户端

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 15:08
*/
//客户端给服务端发消息,服务端输出此消息到控制台
public class testCS { //客户端
@Test
public void client(){
Socket socket = null;
OutputStream outputStream = null;
InputStream is = null;
try {
//1.创建一个Scoket 的对象,通过构造器知名服务端的IP地址,以及其接收的端口号
socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
//2.getOutputStream():发送数据,方法返回OutputStream对象
outputStream = socket.getOutputStream();
//3.具体的输出过程
outputStream.write(("我是客户端,我的地址是"+socket.getInetAddress().getHostAddress()).getBytes());
//声明给服务端发送的东西完毕
socket.shutdownOutput();
//接收服务端的回应
is = socket.getInputStream();
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭流和Socket
if(null != outputStream) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null != socket) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
//服务端
@Test
public void server(){
ServerSocket ss = null;
Socket st = null;
InputStream is = null;
OutputStream outputStream = null;
try {
//1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用其accept()方法,返回一个Socket对象
st = ss.accept();
//3.调用Socket对象的getInputStream() 获取一个从客户端发送过来的输入流
is = st.getInputStream();
//4.对获取的输入流进行操作
byte[] b = new byte[50];
int len;
while((len = is.read(b)) != -1){
String str = new String(b,0,len);
System.out.println(str);
}
// if(st.isInputShutdown()) {
//给予客户端回应
outputStream = st.getOutputStream();
outputStream.write("我已经收到,这是给你(客户端)的回应哦".getBytes());
// }
} catch (IOException e) {
e.printStackTrace();
}finally {
//5.关闭流和Socket 和ServerSocket对象
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != ss) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != st) {
try {
st.close();
} catch (IOException e) {
e.printStackTrace();
}
} } }
}

一般关流的时候,遵循从后往前的顺序。

案例3:从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; /**
* @author: wsj
* @date: 2018/10/14
* @time: 16:21
*/
//从客户端发送文件给服务端,服务端保存到本地,并返回"发送成功"给客户端,并关闭相关连接
//注意:本案例中的关流等操作都应该使用try...catch...finally 而不能使用throws Exception 本案例只是为书写方便~

public class socketTomcat {
//客户端
@Test
public void client() throws Exception{
//
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9898);
//
OutputStream outputStream = socket.getOutputStream();
FileInputStream file = new FileInputStream(new File("1.jpg"));
byte[] b = new byte[1024];
int len ;
while((len = file.read(b)) != -1){
outputStream.write(b,0,len);
}
//
socket.shutdownOutput();
//
InputStream inputStream = socket.getInputStream();
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
String str = new String(b1,0,len1);
System.out.println(str);
}
inputStream.close();
outputStream.close();
file.close();
} @Test
public void server() throws Exception{
ServerSocket serverSocket = new ServerSocket(9898);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
FileOutputStream file = new FileOutputStream("3.jpg");
byte[] b1 = new byte[1024];
int len1 ;
while((len1 = inputStream.read(b1)) != -1){
file.write(b1,0,len1);
} OutputStream outputStream = socket.getOutputStream();
outputStream.write(("来自"+socket.getInetAddress().getHostAddress()+"的图片接收成功").getBytes()); outputStream.close();
file.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}

java之网络编程1-Tcp的更多相关文章

  1. Java:网络编程值TCP的使用

    演示TCP传输   1.Tcp分客户端和服务端 2.客服端对应的对象是scoket    服务端对应的对象是serverscoket   客户端: 通过查阅scoket对象,发现在建立对象时,就可以连 ...

  2. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  3. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  4. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  6. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  7. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

  8. Java面向对象 网络编程 下

    Java面向对象 网络编程  下 知识概要:                   (1)Tcp 练习 (2)客户端向服务端上传一个图片. (3) 请求登陆 (4)url 需求:上传图片. 客户端:   ...

  9. Java面向对象 网络编程 上

     Java面向对象 网络编程 上 知识概要:                     (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...

  10. Java基础——网络编程(二)

    一.套接字 Socket 网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送.它在应用程序中创建,通过一种绑定机制与驱动程序建立关系, ...

随机推荐

  1. 深入了解Netty【二】零拷贝

    引言 以下翻译自:Zero Copy I: User-Mode Perspective 零拷贝是什么? 为了更好地理解问题的解决方案,我们首先需要理解问题本身.让我们来看看什么是参与网络服务器的简单过 ...

  2. 伪距定位算法(matlab版)

    在各种伪距定位算法中,最小二乘法是一种比较简单而广泛的方法,该算法可以分为以下几步: 1.准备数据与设置初始值 这里准备数据,主要是对于各颗可见卫星,收集到它们在同一时刻的伪距测量值,计算测量值的各项 ...

  3. springboot入门遇到Whitelabel Error Page错误

    错误页面: 解决方法: 启动类要放在最外层,改成下面的

  4. 20190923-11Linux crond 系统定时任务 000 019

    crond 服务管理 1.重新启动crond服务 [root@hadoop101 ~]# service crond restart centOS7是 systemctl restart crond ...

  5. Ubuntu查看并修改主机名的方法

    1 查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 在终端窗口中,主机名通常位于@符号后:root@lzyws739307453:~#例如这个的主机名就是lzyws739307453. ...

  6. Java面试必问之-JUC

    JUC:java.util.concurrent (Java并发编程工具类) 代码:D:\JAVA\Java_Learning\Elipse_Project\workspace200301EE\JUC ...

  7. Windows下安装Nginx及负载均衡

    1.下载Windows版本的Nginx http://nginx.org/en/download.html 2.解压Nginx包,配置conf文件下的nginx.conf文件 3.配置说明: #use ...

  8. JVM字符串常量池StringTable

    String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式: String s2 = ...

  9. 我的Python自学之路-001 列表的知识

    #_date_:2020/9/11 '''列表和字典是python中用的最多的数据类型 假如要存储一个班级的人名,需要怎么做?有这么几种方法:1.定义很多个变量: name0 = 'wucaho' n ...

  10. 我告诉你一个 AtomicInteger 的惊天大秘密

    i++ 不是线程安全的操作,因为它不是一个原子性操作. 那么,如果我想要达到类似 i++ 的这种效果,我应该使用哪些集合或者说工具类呢? 在 JDK1.5 之前,为了确保在多线程下对某基本数据类型或者 ...