The reason schools have a "no fighting back" rule is because kids tend to fight back because of insult. "He took my hat, so I was just fighting back when I punched him." etc, etc.
I always teach my kids that they have a right to fight back if they feel they are in physical danger, but *only* to the extent required to escape. My kids may not physically punish another child, so hitting someone to "teach them a lesson" is absolutely not okay. However, if another child fastens his teeth in my son's arm, my son is empowered and encouraged to whack the other kid to make them let go. Incidentally, I teach my kids that they can fight back in self-defense against anyone, including adults.
Definitely teach your son to loudly describe the problem "NO! STOP BITING ME!" Never leave these two alone together.
Talk your friend. Let her know, in the most supportive possible terms, that you have noticed that she is working hard to teach her son to play more gently with his friends. Tell her that you'd like to support her in this by ending the visit immediately every time either child hits, scratches, or bites. If either child does anything aggressive, the visit is over. (Yes, I know you're child isn't doing any of these things, but making it a policy for both kids will probably feel less like an attack to your friend.) Use the "Love and Logic" approach:
"Oh how sad. Children are fighting. Playtime is over. I hope the next playtime will be longer!"
If possible, plan a lot of short visits (like 30 minutes). If the kids make it to the end of the visit without an incident, celebrate exuberantly and tell *both* kids how proud you are.
"We had a happy, fun visit with no fighting! I'm so proud of you both. I really look forward to our next visit! Visiting together is so fun!"
Make sure the kids are well-rested and fed so they're both at their best. Also, make sure something fun and desirable is happening, so both kids *want* the playdate to continue. They should both be disappointed when the visit ends, not relieved.